首先看一段代码:
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()方法。但是也许这样可能会造成一些问题,主要还是视情况而定。
