为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2021-08-19 19:59:20
我正在尝试从 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)中创建处理程序,但我希望有人对此有解决方法。提前致谢!
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

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


  try {

        Thread.sleep(250)   

        //File writing...

  }catch (IOException e) {


      }catch (InterruptedException e) {


      }


查看完整回答
反对 回复 2021-08-19
?
千万里不及你

TA贡献1784条经验 获得超9个赞

是的,将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 做任何线程通常已经过时了


查看完整回答
反对 回复 2021-08-19
  • 2 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信