关于在子线程中在run方法执行完之后通知主线程进行操作的方法。(Toast在子线程中无法使用)
首先看一段代码:
private static class SaveToDisk implements Runnable {
private OnFinishedListener listener;
public SaveToDisk(OnFinishedListener ){
this.listener = listener;
}
@Override
public void run() {
...... //operate
}
//新建一个线程并将其发送到主线程的MessageQueue
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
listener.onFinished(newFile, exception);
}
});
}
//回调接口
public interface OnFinishedListener {
void onFinished();
}
}
上面这段代码是在子线程中完成的,通常我们可能需要将一些文件的读写操作放在子线程中进行,这时当需要使用Toast时,使用到的Context有可能已经被销毁而在异步线程中得到的就是null。所以,可能需要在子线程操作完成后通知主线程进行改变。
可以看到在子线程中定义了一个回调接口,然后在run方法内使用Handler.post方法将一个新开的线程发送到主线程的Looper的MessageQueue中处理。
之后,主线程中代码如下:
new Thread(new SaveToDisk(new SaveToDisk.OnFinishedListener() {
@Override
public void onFinished() {
..... //operate
})).start();
在主线程启动线程,并重写onFinished方法。回调子线程中相应的方法,完成最后的操作。
当然,标题中写到了关于Toast在子线程中无法使用,当然也可以使用Looper.preper(),Looper.loop()方法。但是也许这样可能会造成一些问题,主要还是视情况而定。