2014-09-29 63 views
2

我有一个包含6个异步方法的类,每个类都应该调用一个阻塞方法。 (意思是阻塞方法在后台线程上发布,结果发布在ui线程上)重复使用执行异步代码并回发到UI线程的代码

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

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线程

有一个 “漂亮” 的方式来重用这个代码?

+0

您可以发布aynChronous任务的onPostExecute中的结果也是如此 – 2014-09-29 14:03:51

回答

1

虽然有点冗长,也许这可能有帮助?

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调用变得

mBackgroundThreadHandler.post(new BgTask() { 
    @Override 
    String getResult() { 
     return myBlockingMethod(); 
    } 

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

你应该考虑做自定义处理程序,而不是仅仅发布的Runnable他们

的UI自定义处理

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; 
     } 
    } 
}; 

后台处理程序

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; 
     } 
    } 
}; 

因此,要启动过程中,你做的事:

Message m = new Message(); 
m.what = 0; 
mBackgroundThreadHandler.sendMessage(m); 
1

使用可以使用下面的类

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); 
      } 
     }); 
    } 
} 

并执行这样的

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 

       } 
      }); 
     } 
    });