AsyncTask - 如何在 AsyncTask 中使用带有 postDelayed(Runnable, int) 的处理程序?
AsyncTask - How to use a Handler with postDelayed(Runnable, int) inside an AsyncTask?
我正在尝试从 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,但是如果您不熟悉它,则需要一些时间来学习。在另一个线程上运行您的操作的代码示例,returns 在主线程上产生结果并延迟 250 毫秒:
(Kotlin here) Completable.fromAction(object : Action {
override fun run() {
// your action
}
}).subscribeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.delay(250, TimeUnit.MILLISECONDS)
.subscribe()
AsyncTask
通常已过时,无法执行任何线程
我正在尝试从 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,但是如果您不熟悉它,则需要一些时间来学习。在另一个线程上运行您的操作的代码示例,returns 在主线程上产生结果并延迟 250 毫秒:
(Kotlin here) Completable.fromAction(object : Action {
override fun run() {
// your action
}
}).subscribeOn(Schedulers.newThread())
.subscribeOn(AndroidSchedulers.mainThread())
.delay(250, TimeUnit.MILLISECONDS)
.subscribe()
AsyncTask
通常已过时,无法执行任何线程