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

Java AsyncTask-如何在AsyncTask中使用具有postDelayed(Runnable,int)的处理程序?,java,android,android-asynctask,runnable,android-handler,Java,Android,Android Asynctask,Runnable,Android Handler,我试图从BufferedInputStream中写入,我以前使用过while语句,它工作得很好,但现在我想延迟每250毫秒写入一次的循环。因此,我考虑使用带有postdayed的处理程序 这是我在使用时使用的代码: 但当我把它转向这个: new Handler().postDelayed(new Runnable() { @Override public void run() { try {

我试图从BufferedInputStream中写入,我以前使用过while语句,它工作得很好,但现在我想延迟每250毫秒写入一次的循环。因此,我考虑使用带有postdayed的处理程序

这是我在使用时使用的代码:

但当我把它转向这个:

 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方法中,您已经处于backround线程中,在很短的时间间隔内调用sleep没有问题

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

      }catch (InterruptedException e) {

      }
`

是的,处理程序将消息发布到您创建它的线程-这意味着您在另一个线程上创建了处理程序,其中默认情况下没有设置循环,而在主线程上默认设置循环-这就是为什么在主线程上创建处理程序时处理程序会立即工作的原因

您可以在将来使用标准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对于任何线程来说都是过时的

谢谢,它成功了!我确实把Thread.sleep250放进了while语句中,并且完成了这个技巧!
  (Kotlin here) Completable.fromAction(object : Action {
        override fun run() {
            // your action
        }
    }).subscribeOn(Schedulers.newThread())
            .subscribeOn(AndroidSchedulers.mainThread())
            .delay(250, TimeUnit.MILLISECONDS)
            .subscribe()