Xin chào và cảm ơn sự giúp đỡ của bạn.Nhận kết quả từ một số AsyncTasks
Tôi có số method
gọi số AsyncTask
để truy xuất một số dữ liệu từ mạng.
method
được gọi nhiều lần theo trình tự và do đó khởi chạy một số AsyncTasks.
Từ mỗi lần khởi chạy của method
Tôi cần lấy lại kết quả chính xác từ AsyncTask tương đối (và không phải từ một số AsyncTask khác được gọi trước hoặc sau).
Bất kỳ trợ giúp nào được đánh giá cao.
CHỈNH SỬA CHỈNH SỬA CHỈNH SỬA CHỈNH SỬA Đã thêm phần còn lại của mã.
Xin lưu ý: toàn bộ quá trình chạy bên trong Dịch vụ .
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;
}
}
Có thể thực hiện được nhưng không được khuyến nghị qua 'Asynctask.get() ', tôi đã giải thích API đặc biệt này nhiều hơn một chút trong [câu trả lời này] (http://stackoverflow.com/questions/8921244/return-data-from -asynctask-android/8922074 # 8922074). – yorkw
Tại sao bạn không chỉ chuyển RemoteViews vào UpdateTaskPrice AsyncTask của bạn trong hàm khởi tạo của nó và 'setTextViewText' bên trong onPostExecute? Bằng cách này, mỗi AsyncTask đều biết View nào sẽ cập nhật và thậm chí bạn sẽ không cần kết quả –
sử dụng một intentservice. đó là đủ đồng bộ. – njzk2