【问题标题】:Android: Sending data from Android to server using JSON-Object & HttpClientAndroid:使用 JSON-Object 和 HttpClient 将数据从 Android 发送到服务器
【发布时间】: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


【解决方案1】:

检查 JsonObject "c" 是否真的包含这些字段。可能你会在下面的一行中得到 NullPointerException。

    // 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);

您可以通过以下代码检查jsonobject是否具有特定名称的映射

if(jsonObject.has(TAG_NAME)) {
    String name = c.getString(TAG_NAME);
}

或者您可以检查 json 是否具有名称映射但其值为 null

if(!jsonObject.isNull(TAG_NAME)) {
    String name = c.getString(TAG_NAME);
}

此外,如果没有映射或名称为空值,则可以得到一个空字符串

if(jsonObject.optString(TAG_NAME)) {
    String name = c.getString(TAG_NAME);
}

编辑: 你不创建你的 asyncTask 对象。在调用其执行方法之前创建它。

doInBack = new DownloadWebPageTask();
doInBack.execute(...)

【讨论】:

  • 或者使用 opt*, optString optInt ... 你永远不会得到 NullPointerException 只是一个空字符串
  • 上述方法都不起作用..同样的错误..我没有找到在 mainactivity 中调用 AsyncTask 的位置。调用 AsyncTask 的方法是否正确?
  • 在这里崩溃.. doInBack = (DownloadWebPageTask) doInBack .execute(new String[] { "192.168.1.40" });
猜你喜欢
  • 2011-02-02
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多