2017-07-30 45 views
-1

这是AsyncTask类中的代码: package com.mermit.enter;如何将asynctask的结果返回到我的主线程

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;

回答

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

} 
+2

在2017年与静态字段沟通..? – EpicPandaForce

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(); 
相关问题