Android - 为 AsyncTask 设置超时?

2022-08-31 08:36:21

我有一个类,我执行它从网站下载大量数据。AsyncTask

如果最终用户在使用时数据连接非常慢或参差不齐,我想在一段时间后使超时。我的第一种方法是这样的:AsyncTask

MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
  @Override
  public void run() {
      if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
          downloader.cancel(true);
  }
}, 30000 );

启动 后,将启动一个新的处理程序,如果它仍然在运行,它将在 30 秒后取消。AsyncTaskAsyncTask

这是一个好方法吗?还是内置了更适合此目的的内容?AsyncTask


答案 1

是的,有 AsyncTask.get()

myDownloader.get(30000, TimeUnit.MILLISECONDS);

请注意,通过在主线程(AKA.UI线程)将阻止执行,您可能需要在单独的线程中调用它。


答案 2

在 onPreExecute() 方法中将 CountDownTimer 类用于 AsyncTask 的扩展类的一侧:

主要优点是异步监视在类内部完成。

public class YouExtendedClass extends AsyncTask<String,Integer,String> {
...
public YouExtendedClass asyncObject;   // as CountDownTimer has similar method -> to prevent shadowing
...
@Override
protected void onPreExecute() {
    asyncObject = this;
    new CountDownTimer(7000, 7000) {
        public void onTick(long millisUntilFinished) {
            // You can monitor the progress here as well by changing the onTick() time
        }
        public void onFinish() {
            // stop async task if not in progress
            if (asyncObject.getStatus() == AsyncTask.Status.RUNNING) {
                asyncObject.cancel(false);
                // Add any specific task you wish to do as your extended class variable works here as well.
            }
        }
    }.start();
...

例如,更改CountDownTimer(7000,7000)->CountDownTimer(7000,1000),它将在调用onFinish()之前调用tick()6次。如果要添加一些监视,这很好。

感谢您在此页面上获得的所有好建议:-)


推荐