首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重用执行异步代码并回发到UI线程的代码

重用执行异步代码并回发到UI线程的代码
EN

Stack Overflow用户
提问于 2014-09-29 13:55:29
回答 3查看 75关注 0票数 2

我有一个有6个异步方法的类,每个类都应该调用一个阻塞方法。(这意味着,阻塞方法在后台线程上发布,结果发布在ui线程上)

我发现我自己编写了以下代码6次(每个异步方法1次),只有阻塞方法和“结果”对象类型不同。

代码语言:javascript
复制
    mBackgroundThreadHandler.post(new Runnable() {

        @Override
        public void run() {

            final String result = myBlockingMethod();

            mUIHandler.post(new Runnable() {

                @Override
                public void run() {
                     //use result on UI thread
                }
            });

        }
    });
  • mBackgroundThreadHandler -后台线程的处理程序
  • mUIHandler - ui线程的处理程序

是否有一种“漂亮”的方法来重用这些代码?

EN

回答 3

Stack Overflow用户

发布于 2014-09-29 14:14:14

虽然还有点长,也许这能帮上忙吗?

代码语言:javascript
复制
abstract class BgTask implements Runnable {

    @Override
    public void run() {
        final String result = getResult();
        mUIHandler.post(new Runnable() {
            @Override
            public void run() {
                processResult(result);
            }
        });
    }

    abstract String getResult();

    abstract void processResult(String result);

}

使用上面的类,mBackgroundThreadHandler调用变成

代码语言:javascript
复制
mBackgroundThreadHandler.post(new BgTask() {
    @Override
    String getResult() {
        return myBlockingMethod();
    }

    @Override
    void processResult(String result) {
        // UI magic.
    }
});
票数 1
EN

Stack Overflow用户

发布于 2014-09-29 14:14:19

您可能应该考虑执行自定义处理程序,而不是仅仅将Runnable发布到它们

UI自定义处理程序

代码语言:javascript
复制
Handler mUIHandler = new Handler(Looper.getMainLooper()){

   public void handleMessage (Message msg){
       switch(msg.what){
           case 0: // action 0,
               doResultZero(msg.obj);
               break;
           case 1: // action 1
               break;
           case 2: // action 2 
               break;
       }
   }
};

后台处理程序

代码语言:javascript
复制
Handler mBackgroundThreadHandler = new Handler( /* insert here the background looper */){

   public void handleMessage (Message msg){
       switch(msg.what){
           case 0: // action 0 
               msg.obj = executeActionZero();
               mUIHandler.sendMessage(msg);
               break;
           case 1: // action 1
               break;
           case 2: // action 2 
               break;
       }
   }
};

因此,要开始您所做的过程:

代码语言:javascript
复制
Message m = new Message();
m.what = 0;
mBackgroundThreadHandler.sendMessage(m);
票数 1
EN

Stack Overflow用户

发布于 2014-09-29 14:18:58

可以使用以下类

代码语言:javascript
复制
public class RunnableOnBackgroudAndResultOnUI {

    private Handler mBackgroundThreadHandler; 
    private Handler mUIHandler;

    public RunnableOnBackgroudAndResultOnUI(Handler backgroundThreadHandler, Handler uIHandler) {
        mBackgroundThreadHandler = backgroundThreadHandler;
        mUIHandler = uIHandler;
    }

    public void run(final Runnable background, final Runnable ui) {
        mBackgroundThreadHandler.post(new Runnable() {

            @Override
            public void run() {
                background.run();
                mUIHandler.post(ui);
            }
        });
    }
}

然后像这样执行

代码语言:javascript
复制
RunnableOnBackgroudAndResultOnUI runnableOnBackgroudAndResultOnUI = new RunnableOnBackgroudAndResultOnUI(mBackgroundThreadHandler, mUIHandler);

runnableOnBackgroudAndResultOnUI.run(new Runnable() {

                @Override
                public void run() {
                    // run on background 

                }
            }, new Runnable() {

                @Override
                public void run() {
                    // run on ui

                }
            });
        }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26101626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档