Java 如何在AsyncTask中更新ArrayList的内容?

Java 如何在AsyncTask中更新ArrayList的内容?,java,android,json,android-asynctask,Java,Android,Json,Android Asynctask,我试图做的是从json文件中获取一个名称列表,并将其存储到ArrayList中。我使用getPointsList()方法实现了一个名为ServiceHandler的类。所有的值和对象传递似乎都是正确的,所以我想知道运行AsyncTask是否有问题。错误日志似乎返回NullPointerException语句 这里是服务处理程序 public class ServiceHandler { private static String pt_url="full url name here";

我试图做的是从json文件中获取一个名称列表,并将其存储到ArrayList中。我使用getPointsList()方法实现了一个名为ServiceHandler的类。所有的值和对象传递似乎都是正确的,所以我想知道运行AsyncTask是否有问题。错误日志似乎返回NullPointerException语句 这里是服务处理程序

public class ServiceHandler {
    private static String pt_url="full url name here";
    private static final String TAG_NAME = "name";
    private static final String TAG_LON = "gps_lon";
    private static final String TAG_LAT = "gps_lat";

ArrayList<String> PList;

static String response = null;
public final static int GET = 1;
public final static int POST = 2;
static InputStream is= null;
static JSONObject jObj=null;
ProgressDialog pDialog;
Activity A;
JSONArray json;

public ServiceHandler(Activity A) {
    this.A=A;
}

/**
 * Making service call
 * @url - url to make request
 * @method - http request method
 * */
public String makeServiceCall(String url, int method) {
    return this.makeServiceCall(url, method, null);
}

/**
 * Making service call
 * @url - url to make request
 * @method - http request method
 * @params - http request params
 * */
public String makeServiceCall(String url, int method,
        List<NameValuePair> params) {
    try {
        // http client
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpEntity httpEntity = null;
        HttpResponse httpResponse = null;

        // Checking http request method type
        if (method == POST) {
            HttpPost httpPost = new HttpPost(url);
            // adding post params
            if (params != null) {
                httpPost.setEntity(new UrlEncodedFormEntity(params));
            }

            httpResponse = httpClient.execute(httpPost);

        } else if (method == GET) {
            // appending params to url
            if (params != null) {
                String paramString = URLEncodedUtils
                        .format(params, "utf-8");
                url += "?" + paramString;
            }
            HttpGet httpGet = new HttpGet(url);

            httpResponse = httpClient.execute(httpGet);

        }
        httpEntity = httpResponse.getEntity();
        response = EntityUtils.toString(httpEntity);

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return response;

}

public ArrayList<String> getPointsList() throws JSONException{
    GetPoints AT = new GetPoints();
    pDialog = new ProgressDialog(A);
    pDialog.setMessage("Retreiving points...");
    pDialog.setCancelable(false);
    pDialog.show();
    AT.execute(pt_url);

    PList = new ArrayList<String>();
    int i;
    Log.d("",""+AT.getStatus());
在getPointsList()中,可以执行以下操作:

for (i = 0; i < json.length(); i++) {
  JSONObject c = json.getJSONObject(i);
for(i=0;i

变量json为null,因为ASyncTask尚未完成。

第123行是什么?您是否调试应用程序并找到获取NullPointer的位置问题在于第123行上的for循环,因为ASyncTask似乎从未完成,这意味着json保持为null。因此问题一定是ASyncTask未结束。这并不完全是错误是否清除执行AT.getStatus检查代码的位置?是否有任何原因不只是使用postExecute方法来运行该代码(这样就不需要AT status检查,因为一旦toInBackground完成,就会调用该方法?是的,这就是我尝试使用(AT.getStatus().equals(AsyncTask.status.FINISHED))的原因AsyncTask在某种程度上一直在运行,但当我打印以登录onPostExecute()时,它没有问题。因此,我认为AsyncTask到达了其执行的最后一个方法。
    04-03 02:22:37.480: E/AndroidRuntime(18824): FATAL EXCEPTION: main
04-03 02:22:37.480: E/AndroidRuntime(18824): java.lang.NullPointerException
04-03 02:22:37.480: E/AndroidRuntime(18824):    at com.example.demo.ServiceHandler.getPointsList(ServiceHandler.java:123)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at com.example.demo.MainMenuActivity$2.onClick(MainMenuActivity.java:70)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at android.view.View.performClick(View.java:4198)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at android.view.View$PerformClick.run(View.java:17158)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at android.os.Handler.handleCallback(Handler.java:615)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at android.os.Looper.loop(Looper.java:137)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at android.app.ActivityThread.main(ActivityThread.java:4918)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at java.lang.reflect.Method.invokeNative(Native Method)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at java.lang.reflect.Method.invoke(Method.java:511)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
04-03 02:22:37.480: E/AndroidRuntime(18824):    at dalvik.system.NativeStart.main(Native Method)
04-03 02:22:37.680: D/Response:(18824): > [{"id":"5","name":"The Hendrix Center","gps_lat":"34.67605277777778","gps_lon":"-82.831825","campus_id":"1"},{"id":"7","name":"Red Fern","gps_lat":"34.67575","gps_lon":"-82.83358055555556","campus_id":"1"},{"id":"9","name":"McAdams Hall","gps_lat":"34.67559166666666","gps_lon":"-82.83461388888888","campus_id":"1"},{"id":"10","name":"Edwards Hall","gps_lat":"34.67681666666667","gps_lon":"-82.83379166666666","campus_id":"1"},{"id":"11","name":"Vickory Hall","gps_lat":"34.677375","gps_lon":"-82.83379722222222","campus_id":"1"},{"id":"12","name":"Daniel Hall","gps_lat":"34.67714722222222","gps_lon":"-82.8351611111111","campus_id":"1"},{"id":"13","name":"Kinard Hall","gps_lat":"34.677524999999996","gps_lon":"-82.83515","campus_id":"1"},{"id":"14","name":"Martin Hall","gps_lat":"34.67805833333333","gps_lon":"-82.83553055555555","campus_id":"1"}]
for (i = 0; i < json.length(); i++) {
  JSONObject c = json.getJSONObject(i);