当前位置: 首页 > 面试题库 >

一段时间后取消AsyncTask

毋琪
2023-03-14
问题内容

这可能是一个重复的问题,但我没有找到想要的东西。我在UI活动中调用AsyncTask, new LoadData().execute();在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时,您需要在一定时间后运行cancle任务(=超时,在这种情况下为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 Handler(Looper.getMainLooper());



 类似资料:
  • 在我的Spring启动应用程序中,我有kafka消费者类,每当主题中有可用消息时,它会频繁读取消息。我想限制消费者每隔2小时消费一次消息。就像阅读完一条消息后,消费者将暂停2小时,然后再消费另一条消息。这是我的消费者配置方法:- 然后我创建了这个容器方法,在其中我设置了kafka配置的其余部分 使用此代码分区每2小时重新平衡一次,但它根本没有读取消息。我的kafka消费者方法:-

  • 使用Spring AMQP(使用RabbitMQ作为消息代理),我正在准备一个消息,并且我希望我的消息在有时之后被使用。在此之前,它可以在某个队列中等待,比如等待队列,然后移动到我们的主队列,在那里我们有消费者,它正在等待处理来自主队列的消息。 p.s>如果没有rabbitmq_delayed_message_exchange插件也可以。

  • 我们有一个具有Ha all策略的2节点RabbitMQ集群。我们在应用程序中使用Spring AMQP与RabbitMQ对话。生产者部分工作正常,但消费者工作了一段时间并暂停。生产者和消费者作为不同的应用程序运行。更多关于消费者部分的信息。 我们将与一起使用,使用手动模式和默认 在我们的应用程序中,我们创建队列(按需)并将其添加到侦听器中 当我们从10个和20个开始时,消费大约持续15个小时并暂停

  • 我正在创建一个应用程序,当按下按钮时,它会在“for循环”中生成一些啁啾声,我想在循环过程中阻止按钮,并在循环结束时重新播放。 我尝试了此操作,但应用程序崩溃: 我在日志中发现了以下错误: 06-19 11:15:00.852:E/AndroidRuntime(29419):致命异常:Thread-5516 06-19 11:15:00.852:E/AndroidRuntime(29419):an

  • 更新06/04这里是消费者出厂设置。它是Spring-Kafka-1.3.1。Kafka经纪人合流版 注意:容器工厂已将自动启动设置为false。这是在加载大文件时手动启动/停止使用者。 运行大约1小时后(时间不同),使用者停止使用来自其主题的消息,即使该主题有许多可用消息。Consumer方法中有一个log语句,用于停止在日志中打印。 我们如何设计Spring-Kafka消费者,使其在停止消费的

  • 我注意到我的Kafka Streams应用程序在一段时间没有读取来自Kafka主题的新消息时停止工作。这是我第三次看到这种情况发生。 自5天以来,没有向主题发送任何消息。我的Kafka Streams应用程序也托管了一个spark java Web服务器,它仍然具有响应能力。然而,Kafka Streams不再阅读我向Kafka主题发出的消息。当我重新启动应用程序时,所有消息都将从代理获取。 如何