我在我的应用程序中使用AsyncTask。但第一次onPostExecute()没有被调用。从那以后它的召唤。可能是什么问题?
这就是我调用AsyncTask的方法 -
new NotificationListAsyncTask(this, notificationCountHandler).execute();
以下是我的AsyncTask -
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.SharedPreferences;
public class NotificationListAsyncTask extends AsyncTask<String, Void, Void> {
Context context;
private static final String TAG_DATA = "data";
private Handler handler;
public static final String KEY_NOTIFICATION_COUNT = "key_notification_count";
public static final int KEY_NOTIFICATION_MESSAGE = 1001;
private static final String TAG_NOTIFICATION_ID = "ID";
public NotificationListAsyncTask(Context context, Handler handler) {
this.context = context;
this.handler = handler;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(String... params) {
// Creating service handler class instance
RequestHandler requestHandler = new RequestHandler(context);
UrlBuilder builder =AppService
.getAppService().getUrlBuilder();
// Making a request to url and getting response
String jsonStr = null;
try {
jsonStr = requestHandler.makeServiceCall(
builder.getNotificationListUrl(
CommonFunctions.getuserId(context),
CommonFunctions.getUtcTime(context)),
RequestHandler.GET);
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if (jsonStr != null) {
try {
JSONObject jsonObj = new JSONObject(jsonStr);
JSONArray contents = null;
// Getting JSON Array node
JSONArray contentsEnclosed = jsonObj.getJSONArray(TAG_DATA);
contents = contentsEnclosed.getJSONArray(0);
for (int i = 0; i < contents.length(); i++) {
JSONObject obj = contents.getJSONObject(i);
String jsonValue = obj.toString();
String contentId = obj.getString(TAG_NOTIFICATION_ID);
AppService.getAppService().insertNotification(jsonValue, contentId);
}
CommonFunctions.setNotificationrequestTime(context);
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Log.e("RequestHandler", "Couldn't get any data from the url");
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
handler.sendEmptyMessage(KEY_NOTIFICATION_MESSAGE);
}
}
先谢谢。
答案 0 :(得分:0)
请参阅AsynkTask生命周期:
onPreExecute()
,在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。
doInBackground(Params...
),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递给此步骤。必须通过此步骤返回计算结果,并将其传递回最后一步。
3。 onPostExecute(Result)
,在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。
所以一旦doInBackground完成,onPostExecute方法就会调用。
答案 1 :(得分:0)
我得到了解决方案。在应用程序类oncreate()方法中使用下面的代码 -
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
try {
Class.forName("android.os.AsyncTask");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
它对我有用,但仍然不知道为什么需要它或者它是正确的方法。以前所有的AsyncTask都运行得很好。我不知道发生了什么,这种行为开始于现在它不能第一次起作用。如果有人知道请解释。