AsyncTask - 如何在AsyncTask中使用带有postDelayed(Runnable,int)的Handler?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsyncTask - 如何在AsyncTask中使用带有postDelayed(Runnable,int)的Handler?相关的知识,希望对你有一定的参考价值。

我正在尝试从BufferedInputStream编写,之前我使用过while语句并且运行良好,但现在我想延迟编写每个250 millisecond的循环。所以,我想到使用HandlerpostDelayed

这是我使用while的代码:

while (count = input.read(data)) > 0){
//File writing...
}

但当我把它转向这个时:

 new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                try {
                    //File writing...
                } catch (IOException e) {
                }
            }
        }, 250);

我得到了这个RuntimeException:

无法在未调用Looper.prepare()的线程内创建处理程序。

我想,它说我不能在一个线程(AsyncTask / Thread)中创建一个处理程序,但我希望有人有一个解决方法。提前致谢!

答案

尝试调用Thread.sleep()而不是在hanler上调用postDelayed,因为在doInBackround方法中你已经处于后台线程中并且在一小段时间内调用sleep是没有问题的

  try {
        Thread.sleep(250)   
        //File writing...
  }catch (IOException e) {

      }catch (InterruptedException e) {

      }

`

另一答案

是的,Handler将消息发布到你创建的Thread上 - 这意味着你在另一个线程上创建了你的处理程序,默认情况下没有设置循环的东西(而在主线程上,循环的东西是默认设置的 - 这就是为什么处理程序在主线程上创建时立即工作。

您可以使用标准Java Timer来安排将来的操作,此计时器使用自己的线程来执行您的操作,例如:

Timer timer = new Timer();
timer.schedule(new TimerTask() {
            @Override
            public void run() {
                // your action
            }
        }, your delay);

另一个解决方案是使用RxJava,但是如果你不熟悉它,那么学习它需要一些时间。在另一个线程上运行您的操作的代码示例,在主线程上返回结果并延迟250毫秒:

  (Kotlin here) Completable.fromAction(object : Action {
        override fun run() {
            // your action
        }
    }).subscribeOn(Schedulers.newThread())
            .subscribeOn(androidSchedulers.mainThread())
            .delay(250, TimeUnit.MILLISECONDS)
            .subscribe()

AsyncTask通常是过时的做任何线程

以上是关于AsyncTask - 如何在AsyncTask中使用带有postDelayed(Runnable,int)的Handler?的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask - 如何在AsyncTask中使用带有postDelayed(Runnable,int)的Handler?

在 Android 中,如何从 AsyncTask 更改 TextView? [复制]

OnCreate 中的 AsyncTask 在运行时失败,如何在 Android 中避免这种情况?

如何正确使用 AsyncTask? [关闭]

如何在 Android 中运行 AsyncTask?

如何在单个 AsyncTask 中访问多个 URL