如何将asynctask的结果返回到我的主线程

时间:2017-07-30 19:18:08

标签: java android multithreading android-asynctask

这是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返回布尔值。我希望主线程等到从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;

2 个答案:

答案 0 :(得分:0)

我建议在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();

答案 1 :(得分:-1)

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

<强> isOnlineTask

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

<强> MainClass

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;
    }

}