我正在尝试从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)内创建处理程序,但我希望有人对此有解决方法。 预先感谢!
答案 0 :(得分:1)
尝试调用Thread.sleep()而不是在hanler上调用postDelayed,因为在doInBackround方法内部您已经处于backround线程中,并且在很小的时间间隔内调用sleep都没有问题
try {
Thread.sleep(250)
//File writing...
}catch (IOException e) {
}catch (InterruptedException e) {
}
`
答案 1 :(得分:0)
是的,Handler
将消息发布到您在其上创建的Thread
上-这意味着您在默认情况下未设置循环对象的另一个线程上创建了处理程序(而在主线程上循环设置是默认设置的-这就是为什么在主线程上创建处理程序后立即可以工作的原因)。
您将来可以使用标准Java Timer
来计划操作,此计时器使用其自己的线程来执行您的操作,例如:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// your action
}
}, your delay);
另一种解决方案是使用RxJava,但是如果您不熟悉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
通常已经过时,无法进行任何线程处理