【发布时间】:2012-06-08 12:35:13
【问题描述】:
我正在尝试使用 android 4.0.3 使用 JSON 对象将数据发送到 Gsoap 服务器。我的 android 应用程序遇到了 NetworkOnMainThread 异常。然后我在 AsyncTask 中使用了网络访问,所以无论如何我都看不到这个异常的意义。但现在我得到了 Nullpointer 异常。我已经发布了带有错误 logcat 的代码。 我已经 google dint 得到了正确的解决方案。所以请任何人告诉我我哪里出错了。我第一次尝试使用 JSON 发送数据.. 我可以在不使用 JSON 的情况下将数据发送到服务器.. 但需要使用 JSON 发送..
它在这一行崩溃 doInBack = (DownloadWebPageTask) doInBack.execute(new String[] { "192.168.1.40" });
这是我的代码.. MainAcitivty 即 AndroidJSONParsingActivity
public class AndroidJSONParsingActivity extends ListActivity {
// url to make request
// private static String url = "http://192.168.1.40";
// JSON Node names
private static final String TAG_CONTACTS = "contacts";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_ADDRESS = "address";
private static final String TAG_GENDER = "gender";
private static final String TAG_PHONE = "phone";
private static final String TAG_PHONE_MOBILE = "mobile";
private static final String TAG_PHONE_HOME = "home";
private static final String TAG_PHONE_OFFICE = "office";
// contacts JSONArray
JSONArray contacts = null;
private AsyncTask<String, Void, String> doInBack;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
// Creating JSON Parser instance
JSONParser jParser = new JSONParser();
doInBack = (DownloadWebPageTask) doInBack
.execute(new String[] { "http://192.168.1.40" });
// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(doInBack);
try {
// Getting Array of Contacts
contacts = json.getJSONArray(TAG_CONTACTS);
// looping through All Contacts
for (int i = 0; i < contacts.length(); i++) {
JSONObject c = contacts.getJSONObject(i);
// Storing each json item in variable
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String email = c.getString(TAG_EMAIL);
String address = c.getString(TAG_ADDRESS);
String gender = c.getString(TAG_GENDER);
// Phone number is agin JSON Object
JSONObject phone = c.getJSONObject(TAG_PHONE);
String mobile = phone.getString(TAG_PHONE_MOBILE);
String home = phone.getString(TAG_PHONE_HOME);
String office = phone.getString(TAG_PHONE_OFFICE);
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_EMAIL, email);
map.put(TAG_PHONE_MOBILE, mobile);
// adding HashList to ArrayList
contactList.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
System.out.println("JsonException--- " + e.getMessage());
}
/**
* Updating parsed JSON data into ListView
* */
ListAdapter adapter = new SimpleAdapter(this, contactList,
R.layout.list_item, new String[] { TAG_NAME, TAG_EMAIL,
TAG_PHONE_MOBILE }, new int[] { R.id.name, R.id.email,
R.id.mobile });
setListAdapter(adapter);
// selecting single ListView item
ListView lv = getListView();
// Launching new screen on Selecting Single ListItem
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name))
.getText().toString();
String cost = ((TextView) view.findViewById(R.id.email))
.getText().toString();
String description = ((TextView) view.findViewById(R.id.mobile))
.getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(),
SingleMenuItemActivity.class);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_EMAIL, cost);
in.putExtra(TAG_PHONE_MOBILE, description);
startActivity(in);
}
});
}
private class DownloadWebPageTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
String response = "";
for (String url : urls) {
DefaultHttpClient client = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
HttpResponse execute = client.execute(httppost);
InputStream content = execute.getEntity().getContent();
BufferedReader buffer = new BufferedReader(
new InputStreamReader(content));
String s = "";
while ((s = buffer.readLine()) != null) {
response += s;
}
} catch (Exception e) {
e.printStackTrace();
}
}
return response;
}
@Override
protected void onPostExecute(String result) {
}
}
}
JsonParser.java 类
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
// constructor
public JSONParser() {
}
public JSONObject getJSONFromUrl(String url) {
// Making HTTP request
try {
// defaultHttpClient
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
// return JSON String
return jObj;
}
public JSONObject getJSONFromUrl(AsyncTask<String, Void, String> doInBack) {
// TODO Auto-generated method stub
return null;
}
}
SingleMenuItemActivity.java 类
public class SingleMenuItemActivity extends Activity {
// JSON node keys
private static final String TAG_NAME = "name";
private static final String TAG_EMAIL = "email";
private static final String TAG_PHONE_MOBILE = "mobile";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.single_list_item);
// getting intent data
Intent in = getIntent();
// Get JSON values from previous intent
String name = in.getStringExtra(TAG_NAME);
String cost = in.getStringExtra(TAG_EMAIL);
String description = in.getStringExtra(TAG_PHONE_MOBILE);
// Displaying all values on the screen
TextView lblName = (TextView) findViewById(R.id.name_label);
TextView lblCost = (TextView) findViewById(R.id.email_label);
TextView lblDesc = (TextView) findViewById(R.id.mobile_label);
lblName.setText(name);
lblCost.setText(cost);
lblDesc.setText(description);
}
}
我的 logcat 错误报告
06-08 17:46:55.459: E/AndroidRuntime(2542): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.androidhive.jsonparsing/com.androidhive.jsonparsing.AndroidJSONParsingAct ivity}: java.lang.NullPointerException
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.ActivityThread.access$600(ActivityThread.java:123)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.os.Handler.dispatchMessage(Handler.java:99)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.os.Looper.loop(Looper.java:137)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.ActivityThread.main(ActivityThread.java:4424)
06-08 17:46:55.459: E/AndroidRuntime(2542): at java.lang.reflect.Method.invokeNative(Native Method)
06-08 17:46:55.459: E/AndroidRuntime(2542): at java.lang.reflect.Method.invoke(Method.java:511)
06-08 17:46:55.459: E/AndroidRuntime(2542): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-08 17:46:55.459: E/AndroidRuntime(2542): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-08 17:46:55.459: E/AndroidRuntime(2542): at dalvik.system.NativeStart.main(Native Method)
06-08 17:46:55.459: E/AndroidRuntime(2542): Caused by: java.lang.NullPointerException
06-08 17:46:55.459: E/AndroidRuntime(2542): at com.androidhive.jsonparsing.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:62)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.Activity.performCreate(Activity.java:4465)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
06-08 17:46:55.459: E/AndroidRuntime(2542): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
非常感谢..
【问题讨论】:
-
AndroidJSONParsingActivity.java:62 是哪一行?
-
该行包含服务器 URL.. asyntask 正在运行..
-
不工作..我得到同样的错误..空指针异常.. :(
-
此时崩溃 doInBack = (DownloadWebPageTask) doInBack .execute(new String[] { "192.168.1.40" });
标签: android json httpclient gsoap