代码之家  ›  专栏  ›  技术社区  ›  khalid3e

AsyncTask-如何在AsyncTask中使用postDelayed(Runnable,int)处理程序?

  •  0
  • khalid3e  · 技术社区  · 6 年前

    我试图从一个缓冲的输入流中写,我用过 while 语句之前,它工作得很好,但现在我想推迟编写每个循环 250 millisecond Handler 具有 postDelayed

    这是我使用的代码 :

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

    但当我转向这个:

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

    我知道了

    无法在尚未调用的线程内创建处理程序活套准备().

    提前谢谢!

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ramees Thattarath    6 年前

    试着打电话线程。睡眠()而不是在hanler上调用postDelayed,因为在doInBackround方法中,您已经处于backround线程中,在很短的时间间隔内调用sleep没有问题

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

    `

        2
  •  0
  •   estn    6 年前

    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 通常是过时的做任何线程