안녕하세요.여러 AsyncTasks에서 결과 얻기
나는 AsyncTask
을 호출하여 네트워크에서 일부 데이터를 가져 오는 method
이 있습니다.
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
RemoteView를 생성자의 AsyncTask UpdateTaskPrice에 전달하고 onPostExecute 내부의 setTextViewText를 전달하지 않는 이유는 무엇입니까? 이런 방식으로 각 AsyncTask는 업데이트 할 뷰를 알고 있으므로 –
인텐시브 서비스를 사용할 필요조차 없습니다. 그것은 충분히 동기식입니다. – njzk2