我有一个有6个异步方法的类,每个类都应该调用一个阻塞方法。(这意味着,阻塞方法在后台线程上发布,结果发布在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
}
});
}
});是否有一种“漂亮”的方法来重用这些代码?
发布于 2014-09-29 14:14:14
虽然还有点长,也许这能帮上忙吗?
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.
}
});发布于 2014-09-29 14:14:19
您可能应该考虑执行自定义处理程序,而不是仅仅将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);发布于 2014-09-29 14:18:58
可以使用以下类
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
}
});
}
});https://stackoverflow.com/questions/26101626
复制相似问题