AsyncTask - 如何在 AsyncTask 中使用带有 postDelayed

我正在尝试从 BufferedInputStream 写入,我while之前使用过语句并且效果很好,但现在我想延迟写入每个250 millisecond. 所以,我考虑使用Handlerwith postDelayed。


这是我使用的代码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)中创建处理程序,但我希望有人对此有解决方法。提前致谢!


呼唤远方
浏览 176回答 2
2回答

浮云间

尝试调用 Thread.sleep() 而不是在 hanler 上调用 postDelayed,因为在 doInBackround 方法中,您已经处于后台线程中,并且在短时间内调用 sleep 没有问题  try {        Thread.sleep(250)           //File writing...  }catch (IOException e) {      }catch (InterruptedException e) {      }

千万里不及你

是的,将Handler消息发布到Thread您创建它的那个 - 这意味着您在另一个线程上创建了您的处理程序,其中默认情况下没有设置循环(而在主线程上,默认情况下设置了循环 - 这就是处理程序工作的原因在主线程上创建时立即)。您可以Timer在将来使用标准 Java来调度操作,此计时器使用自己的线程来执行您的操作,例如: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 做任何线程通常已经过时了
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java