为什么我在尝试解析JSON时在Android的多个库中有java.lang.NullPointerException
我试图在我的Android应用程序中解析JSON格式。我是开发android应用程序的新手,所以我参考了很多教程。我遵循了本教程中的步骤: 以下是我的MainActivity.java类:为什么我在尝试解析JSON时在Android的多个库中有java.lang.NullPointerException,android,json,parsing,nullpointerexception,simpleadapter,Android,Json,Parsing,Nullpointerexception,Simpleadapter,我试图在我的Android应用程序中解析JSON格式。我是开发android应用程序的新手,所以我参考了很多教程。我遵循了本教程中的步骤: 以下是我的MainActivity.java类: package com.example.carlajoyce.parsejson; import android.app.ListActivity; import android.app.ProgressDialog; import android.os.AsyncTask; import android.
package com.example.carlajoyce.parsejson;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public class MainActivity extends ListActivity {
private static String url = "http://tech.ccare.jrhernani.com/tech/workorders";
private static final String TAG_WORKORDERINFO = "workorders";
private static final String TAG_ID = "id";
private static final String TAG_SUBJECT = "subject";
private static final String TAG_DESCRIPTION = "description";
private static final String TAG_INITIATED = "initiated";
private static final String TAG_FINISHED = "finished";
private static final String TAG_CREATEDAT = "created_at";
private static final String TAG_UPDATEDAT = "updated_at";
private static final String TAG_TICKETID = "ticket_id";
private static final String TAG_CREATEDBYID = "createdBy_id";
private static final String TAG_TECHNICIANID = "technician_id";
private static final String TAG_WORKORDERREFID = "workorderref_id";
private static final String TAG_WORKORDERSTATUSID = "workorderstatus_id";
private static final String TAG_DEPARTMENTID = "department_id";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new GetWorkOrders().execute();
}
/**
*Async task class to get JSON by making HTTP call
*/
private class GetWorkOrders extends AsyncTask<Void, Void, Void> {
/*HashMap for ListView*/
ArrayList<HashMap<String, String>> workOrderList;
ProgressDialog pDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Please wait...");
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected Void doInBackground(Void... arg0) {
/*Creating service handler class instance*/
WebRequest webreq = new WebRequest();
/* Making a request to url and getting response*/
String jsonStr = webreq.makeWebServiceCall(url, WebRequest.GETRequest);
Log.d("Response: ", "> " + jsonStr);
workOrderList = ParseJSON(jsonStr);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
/*Dismiss the progress dialog*/
if (pDialog.isShowing())
pDialog.dismiss();
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(
MainActivity.this, workOrderList,
R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});
setListAdapter(adapter);
}
}
private ArrayList<HashMap<String, String>> ParseJSON(String json) {
if (json != null) {
try {
// Hashmap for ListView
ArrayList<HashMap<String, String>> workOrderList = new ArrayList<HashMap<String, String>>();
JSONObject jsonObj = new JSONObject(json);
// Getting JSON Array node
JSONArray workOrders = jsonObj.getJSONArray(TAG_WORKORDERINFO);
// looping through All WorkOrders
for (int i = 0; i < workOrders.length(); i++) {
JSONObject c = workOrders.getJSONObject(i);
String id = c.getString(TAG_ID);
String subject = c.getString(TAG_SUBJECT);
String description = c.getString(TAG_DESCRIPTION);
String initiated = c.getString(TAG_INITIATED);
String finished = c.getString(TAG_FINISHED);
String created_at = c.getString(TAG_CREATEDAT);
String updated_at = c.getString(TAG_UPDATEDAT);
String ticket_id = c.getString(TAG_TICKETID);
String createdBy_id = c.getString(TAG_CREATEDBYID);
String technician_id = c.getString(TAG_TECHNICIANID);
String workorderref_id = c.getString(TAG_WORKORDERREFID);
String workorderstatus_id = c.getString(TAG_WORKORDERSTATUSID);
String department_id = c.getString(TAG_DEPARTMENTID);
// tmp hashmap for single student
HashMap<String, String> workOrder = new HashMap<String, String>();
// adding each child node to HashMap key => value
workOrder.put(TAG_ID,id);
workOrder.put(TAG_SUBJECT, subject);
workOrder.put(TAG_DESCRIPTION, description);
workOrder.put(TAG_INITIATED, initiated);
workOrder.put(TAG_FINISHED, finished);
workOrder.put(TAG_CREATEDAT, created_at);
workOrder.put(TAG_UPDATEDAT, updated_at);
workOrder.put(TAG_TICKETID, ticket_id);
workOrder.put(TAG_CREATEDBYID, createdBy_id);
workOrder.put(TAG_TECHNICIANID, technician_id);
workOrder.put(TAG_WORKORDERREFID, workorderref_id);
workOrder.put(TAG_WORKORDERSTATUSID, workorderstatus_id);
workOrder.put(TAG_DEPARTMENTID, department_id);
// adding student to students list
workOrderList.add(workOrder);
}
return workOrderList;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
} else {
Log.e("ServiceHandler", "Couldn't get any data from the url.");
return null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
注意:我还下载了教程提供的代码,效果很好。
提前感谢。如果
workOrderList
为空,则会发生这种情况
在调用适配器的构造函数之前,必须初始化此列表
ListAdapter adapter = new SimpleAdapter(
MainActivity.this, workOrderList,
R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});
之所以会发生这种情况,是因为您的
ParseJSON
(在doInBackground
方法中调用)可以返回null
,我认为您应该首先初始化适配器并使用空列表查看,所以请移动此项:
ListAdapter adapter = new SimpleAdapter(
MainActivity.this, workOrderList,
R.layout.list_item, new String[]{TAG_SUBJECT, TAG_DESCRIPTION}, new int[]{R.id.subject, R.id.description});
setListAdapter(adapter);
要在MainActivity中创建()并在作业完成时,只需在onPostExecute()中通知适配器数据集已更改
adapter.notifyDataSetChanged();
请让我知道它是否适合你
adapter.notifyDataSetChanged();