Hallo und vielen Dank für Ihre Hilfe.Ergebnisse von mehreren AsyncTasks erhalten
Ich habe eine method
, die eine AsyncTask
ruft, um einige Daten aus dem Netz abzurufen.
Die method
wird mehrmals nacheinander aufgerufen und startet daher mehrere AsyncTasks.
Von jedem Start der method
muss ich das richtige Ergebnis von der relativen AsyncTask (und nicht von einer anderen AsyncTask, die vor oder nach aufgerufen wurde) zurück erhalten.
Jede Hilfe sehr geschätzt.
EDIT EDIT EDIT EDIT Hinzugefügt Rest des Codes.
Bitte beachten Sie: Der gesamte Prozess läuft in einem Service.
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;
}
}
Es ist machbar, aber nicht empfohlen über 'Asynctask.get()', ich habe diese spezielle API ein wenig mehr in [diese Antwort] erklärt (http://stackoverflow.com/questions/8921244/return-data-from -asynctask-android/8922074 # 8922074). – yorkw
Warum geben Sie die RemoteViews nicht einfach an Ihre AsyncTask UpdateTaskPrice in ihrem Konstruktor und 'setTextViewText' in die onPostExecute? Auf diese Weise weiß jede AsyncTask, welche View aktualisiert werden soll, und Sie benötigen nicht einmal das Ergebnis –
einen Intentservice. das ist synchron genug. – njzk2