所以我从另一个checkbetoutcome()
拨打activity
。我的目标是执行AsyncTask
并返回finaloutcomes
方法中填充的onPostExecute()
变量。我是如何实现这一点的,因为finaloutcomes
在后台运行而返回AsyncTask
,代码在{ {1}}方法已完成?
finaloutcomes
** Check_Bet.java
onPostExecute
**
答案 0 :(得分:1)
正如您已经知道AysncTask
以异步方式运行,因此new LoadAllGamet().execute();
将立即返回,因此finaloutcomes
将保留最终值,无论您存储在其中。
对于您想要更新调用者(AsyncTask
)组件(例如,一个Activity)的情况,您应该使用侦听器。
请参阅帖子here,了解如何定义和使用侦听器,基本上是AsyncTask
中定义的接口,其方法由调用者组件实现(例如Activity
)使用适当的参数(您在onPostExecute
中获得的值并传递给Activity
)。
希望这有帮助!
答案 1 :(得分:1)
创建界面
public interface onResultListener {
void showResult(String finalOutcome);
}
活动实现界面
public MyActivity extends Activity implements onResultListener {
public void getResult() {
new LoadAllGamet(this).execute();
}
void showResult(String finalOutcome){
// result from your asynctask
}
}
从AsyncTask调用接口方法
public class LoadAllGamet extends AsyncTask<String, String, String> {
onResultListener listener;
public LoadAllGamer(OnResultListenre listr) {
listener = listr;
@Override
protected void onPostExecute(String param) {
Log.d("SIZE",Integer.toString(allbetsmap.size()));
//ArrayList<Map<String,String>> allbetsmap = new ArrayList<>();
//ArrayList<Map<String,String>> passtocheck = new ArrayList<>();
if (allbetsmap.size() == passtocheck.size()) {
for (int i = 0; i < allbetsmap.size();i++) {
if (allbetsmap.get(i).size() == passtocheck.get(i).size()) {
String finaloutcome = "won";
for (String a : allbetsmap.get(i).keySet()) {
String f = allbetsmap.get(i).get(a);
if(f.equals("null")) {
finaloutcome = "open";
}
else if (! (f.equals(passtocheck.get(i).get(a)))) {
finaloutcome = "lost";
break;
}
}
finaloutcomes.put(Integer.toString(i),finaloutcome);
}
}
}
Log.d("Vital",finaloutcomes.toString());
lister.showResult(finalOutCome);
}
}