如何在onPreExecute中停止异步任务?

5

我正在onPreExecute()中检查网络连接状态,如果没有网络连接,则不应执行doInBackground()和onPostExecute()

new getStatus().execute();

private class getStatus extends AsyncTask<Void, Void, Void> {

2
在执行“AsyncTask”之前,为什么不检查网络连接? - camelCaseCoder
1
我认为等待是有意义的。如果队列已满,AsyncTask 可能不会立即执行,在 onPreExecute 中进行检查将捕获现在和之间失去连接的情况。 - Gabe Sechan
2
公平的观点,但如果是这样,为什么不在 doInBackground() 中检查互联网呢? - camelCaseCoder
1
@camelCaseCoder 我认为这是与流程控制有关,在onPreExecute()中,OP可以简单地Toast“无连接...”,但是如果它已经达到了'doInBackground(),那么该提示应该从onPostExecute()出现,但是如何实现呢?假设doInBackground()`返回对象数组或某些JSON,则OP无法控制例如因服务器上没有数据或操作失败而返回“null”或“无连接”,对吗? - Yazan
1
@Yazan,没错,很有道理。非常好的观点。 :) - camelCaseCoder
有几个选项。您可以使用处理程序直接从doInBackground显示toast。您可以在asynctask中存储具有结果/错误代码的成员,并从onPostExecute中读取。或者,您可以让doInBackground返回一个包含检索数据和/或错误代码的自定义类。可能性是无限的。个人而言,我不会在preExecute中放置任何可能实际使任务无效的逻辑。此外,Internet连接随时都可能消失,包括在任务执行过程中,因此您必须从doInBackground中处理它? - JHH
3个回答

4

在onPreExecute中设置AsyncTask中的一个标志。在其他两个函数中检查该标志,并且如果标志为true,则立即返回。


我的第一反应也是这样的 :), 但是我考虑在 onPreExecute() 中调用 cancel(),但这并不是保证的,对吧? - Yazan
2
我从未尝试在 onPreExecute 中调用它,我期望 doInBackground 是否被调用是实现特定的(它取决于框架检查的位置)。你可以在两个函数中都检查 isCanceled,我认为那样会奏效。 - Gabe Sechan

1

Do this:

public boolean hasInternetConnection(final Context context) {
    final ConnectivityManager connectivityManager = (ConnectivityManager)context.
            getSystemService(Context.CONNECTIVITY_SERVICE);
    final NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    boolean isConnected = networkInfo.isConnectedOrConnecting() && networkInfo.isAvailable() && networkInfo.isConnected();
    return isConnected;
}

将此代码放在onCreate()或任何您想要执行任务并根据结果进行操作的位置,如下所示:
if(hasInternetConnection(YourActivity.this){
   //executeTask
}else{
   //redirect user to Wifi Settings with dialog
}

希望它有所帮助!

1

由于互联网连接随时可能中断,为什么不直接执行任务并在发生IOException时处理它呢?如果没有连接,我猜测进行http请求或者其他操作会立即失败。当然,你可以在尝试之前添加检查,但这样的检查不应该替代网络请求期间的错误处理。

我可能会把所有逻辑放在doInBackground中。如果我先添加一个连接性检查,我会像处理实际请求期间发生的任何网络异常一样处理它。 至于实际的错误处理,你可以将错误代码存储为asynctask的成员变量,也可以让asynctask处理包含数据和错误代码的自定义类,甚至可以使doInBackground在出现错误时返回null并直接从doInBackground处理错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接