这是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;
答案 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;
}
}