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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值