我正在尝试从BufferedInputStream编写,之前我使用过while
语句并且运行良好,但现在我想延迟编写每个250 millisecond
的循环。所以,我想到使用Handler
与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)中创建一个处理程序,但我希望有人有一个解决方法。提前致谢!
尝试调用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
通常是过时的做任何线程