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