java - 一段时间后取消 AsyncTask

标签 java android android-asynctask

这可能是一个重复的问题,但我没有找到我要找的东西。 我在 UI Activity new LoadData().execute(); 中调用一个 AsyncTask,在 doInBackground 中调用一个需要时间的方法。如果一段时间后数据没有返回,我想中断这个线程。 以下是我尝试执行此操作的代码。

class LoadData extends AsyncTask<String, String, String>
{
    @Override
    protected void onPreExecute() {
    super.onPreExecute();
    startTime = System.currentTimeMillis();
    }
    protected String doInBackground(String... args)
    {

        DataCollector dc = new DataCollector();
        data = dc.collectData(query);
        //Here I check if the time is greater than 30 seconds then cancel
        if(((System.currentTimeMillis()-startTime)/1000)>30)
        {
           cancel(true);
        }
    return null;
    }
}

但这并没有在 30 秒后停止任务,实际上它花费了更多时间。 我也尝试了 get(long timeout, TimeUnit unit); 但这也不起作用。

任何人都可以告诉我如何做或如何在 doInBackground 中使用 isCancelled()。

谢谢。

最佳答案

您需要一个线程在一定时间后取消您的任务。该线程可能如下所示:

public class TaskCanceler implements Runnable{
    private AsyncTask task;

    public TaskCanceler(AsyncTask task) {
        this.task = task;
    }

     @Override
     public void run() {
        if (task.getStatus() == AsyncTask.Status.RUNNING )
            task.cancel(true);
     }
}

当您调用 AsyncTask 时,您需要在一定时间后运行取消任务(=超时,在本例中为 20 秒)

private Handler handler = new Handler();
private TaskCanceler taskCanceler;
...
LoadData task = new LoadData();
taskCanceler = new TaskCanceler(task);
handler.postDelayed(taskCanceler, 20*1000);
task.execute(...)

如果您在取消或完成时清理它是个好主意

if(taskCanceler != null && handler != null) {
     handler.removeCallbacks(taskCanceler);
}

您当然可以将其包装在 AsyncTask 的自定义实现中。我已经多次使用这种模式,它就像一个魅力。需要注意的一件事,在极少数情况下处理程序不会启动,我怀疑如果你在错误的上下文中创建它,它在某些情况下将无法生存,所以我强制处理程序成为一个 UI 线程,handler= new处理程序(Looper.getMainLooper());

关于java - 一段时间后取消 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17315372/

相关文章:

java - 在扩展 CrudRepository 的接口(interface)中缓存 Pageable 对象(结果)

java - 我如何使用 For 循环而不是 while 来做同样的事情?

java - 在 Java 中创建一个新的 ArrayList

Android NestedScrollView 在 CoordinatorLayout 中平滑滚动

android - 如何在 ActivityResult 上启动 AsyncTask 并在 MainActivity 上显示

java - 为什么执行AsyncTask时不需要捕获TimeoutException?

android - 两个依赖的 HttpUrlConnection 与 android 中的 AsyncTask

java - 日期的 DateFormat 解析行为从 Java 8 更改为 Java 9,是否有任何相关的环境设置?

android - 弹出菜单随 jquerymobile 中的页面滚动

android - 在 Android Studio 中更改 Github 帐户