Привет и спасибо за вашу помощь.Получение результатов от нескольких AsyncTasks
У меня есть method
, который вызывает AsyncTask
для извлечения некоторых данных из сети.
method
вызывается несколько раз подряд и поэтому запускает несколько AsyncTasks.
С каждого запуска method
Мне нужно вернуть правильный результат из относительной AsyncTask (а не из какой-либо другой AsyncTask, которая была вызвана до или после).
Любая помощь очень ценится.
EDIT EDIT EDIT EDIT Добавлен остальной код.
Обращаем внимание, что:: весь процесс проходит внутри Служба.
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-андроид/8922074 # 8922074). – yorkw
Почему вы просто не переносите RemoteViews в свою AsyncTask UpdateTaskPrice в свой конструктор и 'setTextViewText' внутри onPostExecute? Таким образом, каждый AsyncTask знает, какой вид обновить, и вам даже не понадобится результат –
использовать intenservice. это достаточно синхронно. – njzk2