关于在子线程中在run方法执行完之后通知主线程进行操作的方法。(Toast在子线程中无法使用)

    xiaoxiao2026-05-12  1

    关于在子线程中在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()方法。但是也许这样可能会造成一些问题,主要还是视情况而定。

    转载请注明原文地址: https://ju.6miu.com/read-1309607.html
    最新回复(0)