【问题标题】:How to get the result from the asynctask back to my main thread如何将异步任务的结果返回到我的主线程
【发布时间】:2017-07-30 19:18:08
【问题描述】:

这是 AsyncTask 类中的代码: 包 com.mermit.enter;

import android.os.AsyncTask;
import android.os.Bundle;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class isOnlineTask extends AsyncTask<Void, Void, Boolean> {

    public static Boolean networkStatus;

    @Override
    protected Boolean doInBackground(Void... params) {
        /*try {
            int timeoutMs = 1500;
            Socket sock = new Socket();
            SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);

            sock.connect(sockaddr, timeoutMs);
            sock.close();

            return true;
        } catch (IOException e) { return false; }*/
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // result holds what you return from doInBackground
        networkStatus = result;
    }
}

这是我的主要课程中重要的代码。函数 isOnline 在 if 语句中被调用,并期望从 asynctask 返回布尔值。我希望主线程等待异步任务返回响应,这就是我使用 .get() 的原因。我浏览了网站上的很多问题,但找不到适合我具体情况的解决方法。 Logcat 也不会给出错误消息或任何奇怪的东西,这无济于事。

package com.mermit.enter;

import static com.mermit.enter.isOnlineTask.networkStatus;

...

public boolean isOnline() {
    try {
        new isOnlineTask().get();
        return networkStatus;
    } catch (InterruptedException e) {
        e.printStackTrace();
        return false;
    } catch (ExecutionException e) {
        e.printStackTrace();
        return false;
    }
}

编辑:我也试过 return new isOnlineTask().execute() 代替 new isOnlineTask().get(); return networkStatus;

【问题讨论】:

    标签: java android multithreading android-asynctask


    【解决方案1】:

    我建议在 AsyncTask 的构造函数中提供一个监听器对象,并在 onPostExecute 回调中调用它。例如:

    public class isOnlineTask extends AsyncTask<Void, Void, Boolean> {
       private NetworkStatusListener mListener;
    
       public interface NetworkStatusListener{
          void isStatusAvailable(Boolean result);
       }
    
       // your code...
       public isOnlineTask(NetworkStatusListener listener){
          this.mListener = listener;
       }
       protected void onPostExecute(Boolean result) {
            // result holds what you return from doInBackground
            if (mListener != null){
                mListener.isStatusAvailable(result);
            }
        }
    }
    

    然后在 MainClass 上:

    new isOnlineTask(new NetworkStatusListener{
           void isStatusAvailable(Boolean result){
              //.. do something with the result
           }
       }
    ).execute();
    

    【讨论】:

      【解决方案2】:

      AsyncTask 用于做后台操作,所以你不应该试图停止 UI 线程的执行。 onPostExecute() 在 UI 线程上调用,因此您可以在此处执行任务完成后需要执行的所有操作。如果您需要在主类中知道任务是否完成,您可以执行以下操作

      isOnlineTask

      @Override
      protected void onPostExecute(Boolean result) {
          MainClass.taskIsCompleted(result)
      }
      

      主类

      public class MainClass {
      
          private static boolean isTaskCompleted;
      
          public void genericMethod() {
              if(isTaskCompleted()) {
                  // your operation here
              }
          }
      
          private boolean isTaskCompleted() {
              return isTaskCompleted;
          }
      
          public static void taskIsCompleted(boolean bool) {
              isTaskCompleted = bool;
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        • 1970-01-01
        相关资源
        最近更新 更多