我們知道通常情況下使用異步任務(wù)沒(méi)有辦法設(shè)置返回值,最近新學(xué)會(huì)一招履婉,通過(guò)這個(gè)方法可以同步的獲取在另一個(gè)線程執(zhí)行代碼的結(jié)果
public InstallResult installPackageSync(String apkPath, int flags) {
final ConditionVariable lock = new ConditionVariable();
final InstallResult[] out = new InstallResult[1];
installPackage(apkPath, flags, new InstallCallback() {
@Override
public void onFinish(InstallResult result) {
lock.open();
out[0] = result;
}
});
lock.block();
return out[0];
}
這里我們使用ConditionVariable來(lái)阻塞釋放線程配猫,用數(shù)組來(lái)存儲(chǔ)方法結(jié)果
一個(gè)簡(jiǎn)單的例子
public void onClick(View view) {
Log.e("TAG", "點(diǎn)擊了按鈕");
AsyncTask.execute(new Runnable() {
@Override
public void run() {
final String result = simulationNet();
Log.e("TAG", "run result: " + result );
}
});
}
private String simulationNet() {
final ConditionVariable conditionVariable = new ConditionVariable();
final String[] result = new String[1];
new Thread(new Runnable() {
@Override
public void run() {
SystemClock.sleep(3000);
result[0] = "這是返回值";
conditionVariable.open();
}
}).start();
conditionVariable.block();
return result[0];
}
image.png