2012-06-08 2 views
0

android 4.0.3을 사용하여 JSON 객체를 사용하여 Gsoap 서버로 데이터를 보내려고합니다. 안드로이드 앱으로 NetworkOnMainThread Exception을 실행했습니다. 그런 다음 네트워크 액세스를 AsyncTask에 사용 했으므로 어쨌든이 예외의 요점은 표시되지 않습니다. 하지만 이제는 Nullpointer Exception을 얻고 있습니다. 오류 코드 logcat가있는 코드를 게시했습니다. 나는 이미 Google dint가 적절한 해결책을 얻었습니다. 그러니 누군가 내가 잘못 가고 있다고 나에게 말한다. 처음 JSON을 사용하여 데이터를 보내려고합니다 ... JSON을 사용하지 않고 서버에 데이터를 보낼 수 있지만 .. JSON으로 보내야합니다 ..Android : JSON-Object 및 HttpClient를 사용하여 Android에서 서버로 데이터 전송

이 라인에서 충돌이 발생합니다. 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); 
} 
} 

내 로그 캣 오류 보고서

01 23,516,
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) 

많은 감사 ..

+0

AndroidJSONParsingActivity.java:62 줄은 어느 것입니까? – user370305

+0

그 라인이 서버 URL을 보유 .. asyntask 행동에 .. –

+0

은 .. 내가 점점 오전 같은 오류 .. 널 포인터 예외 .. :( –

답변

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

매핑이 없거나 이름에 null 값이있는 경우 빈 문자열을 얻을 수 있습니다.

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

편집 : asyncTask 개체를 만들지 마십시오. execute 메서드를 호출하기 전에 생성하십시오.

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

또는 opt *, optString optInt ...를 사용하면 결코 빈 문자열 인 NullPointerException을 얻을 수 없습니다. – max4ever

+0

감사합니다. .. –

+0

위의 메서드 중 하나도 작동하지 않습니다 .. 동일한 오류 .. 나는 주 업무에서 AsyncTask를 호출 할 위치를 얻지 못하고 있습니다 .AsyncTask를 호출하는 올바른 방법입니다.? –

관련 문제