不首次调用asynctask的OnPostExecute()

时间:2014-08-18 10:00:30

标签: android android-asynctask

我在我的应用程序中使用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);
}
}

先谢谢。

2 个答案:

答案 0 :(得分:0)

请参阅AsynkTask生命周期:

  1. onPreExecute(),在执行任务之前在UI线程上调用。此步骤通常用于设置任务,例如通过在用户界面中显示进度条。

  2. doInBackground(Params...),在onPreExecute()完成执行后立即在后台线程上调用。此步骤用于执行可能需要很长时间的后台计算。异步任务的参数将传递给此步骤。必须通过此步骤返回计算结果,并将其传递回最后一步。

  3. 3。 onPostExecute(Result),在后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给此步骤。

    所以一旦doInBackground完成,onPostExecute方法就会调用。

    请参阅this document

答案 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都运行得很好。我不知道发生了什么,这种行为开始于现在它不能第一次起作用。如果有人知道请解释。