嗨,感謝您的幫助。從幾個AsyncTasks中獲取結果
我有一個method
調用AsyncTask
來從網絡中檢索一些數據。
method
被依次調用幾次,因此啓動了幾個AsyncTasks。
從method
的每次啓動中,我需要從相關的AsyncTask(而不是從其他在之前或之後調用的其他AsyncTask)中獲取正確的結果。
非常感謝任何幫助。
編輯編輯編輯編輯 添加了其餘的代碼。
請注意:整個過程運行在服務內。
public static class UpdateService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
int[] appWidgetIds = intent.getIntArrayExtra("widgetsids");
final int N = appWidgetIds.length;
AppWidgetManager manager = AppWidgetManager.getInstance(this);
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Log.e("","i="+Integer.toString(i)+ " di "+Integer.toString(N));
RemoteViews view = buildUpdate(getApplicationContext(),
appWidgetIds);
manager.updateAppWidget(appWidgetId, view);
}
return (START_NOT_STICKY);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
private static RemoteViews buildUpdate(Context ctxt, int[] appWidgetIds) {
RemoteViews updateViews = new RemoteViews(ctxt.getPackageName(),
R.layout.widget);
updateViews.setTextViewText(R.id.price1, getPrice(list.get(0)
.getSymbol()));
}
//THIS METHOD IS CALLED SEVERAL TIMES IN SEQUENCE <----
private static String getPrice(String symbol) {
String result="";
UpdateTaskPrice up = new UpdateTaskPrice();
up.execute(symbol, null, null);
//HERE I WANT THE RESULT FROM onPostExecute() <----
return result;
}
//THIS IS THE ASYNCTASK WHICH IS LAUNCHED SEVERAL TIMES
public class UpdateTaskPrice extends AsyncTask<String, Void, String> {
@Override
protected void onProgressUpdate(Void... progress) {
}
@Override
protected void onPostExecute(String result) {
//HERE I RECEIVE THE RESULT FROM doInBackground <----
//I NEED TO PASS IT BACK TO getPrice() <----
}
@Override
protected String doInBackground(String... symbol) {
String result = "";
DefaultHttpClient client = new DefaultHttpClient();
String srt = "";
String url = context.getString(R.string.urlaternativo).concat(
symbol[0]);
HttpGet getMethod = new HttpGet(url);
try {
ResponseHandler<String> responseHandler = new BasicResponseHandler();
srt = client.execute(getMethod, responseHandler);
int inizio = srt.indexOf("<last data=\"");
int fine = srt.indexOf("\"/>", inizio + 12);
result = srt.substring(inizio + 12, fine);
} catch (Throwable t) {
// Log.e("ERROR", "ERROR", t);
}
//HERE I GET THE RESULT I WANT, AND PASS IT TO onPostExecute() <----
return result;
}
}
這是可行的,但不推薦通過'Asynctask.get()',我已經在[這個答案]中解釋了這個特殊的API多一點(http://stackoverflow.com/questions/8921244/return-data-from -asynctask-的Android/8922074#8922074)。 – yorkw 2013-03-27 22:09:37
爲什麼不直接將RemoteViews傳遞給其構造函數中的AsyncTask UpdateTaskPrice以及onPostExecute內部的'setTextViewText'?通過這種方式,每個AsyncTask知道要更新哪個視圖,並且甚至不需要結果 – 2013-04-02 08:30:10
就可以使用intentservice。這足夠同步。 – njzk2 2013-04-02 17:01:44