2013-08-08 5 views
0

Androidhive 자습서를 사용하여 JSON 파일에서 데이터를 가져 와서 목록 또는 격자로 봅니다. 그러나이 응용 프로그램을 실행할 때 응용 프로그램이 충돌하고 종료됩니다. 코드에서 오류를 찾을 수 없습니다. 위의 자습서 링크에서 소스 코드를 다운로드 할 수 있습니다. 그러나 나는 여기에 클래스 파일을 제공했다. 누군가가 가능한 한 빨리 문제를 해결하도록 도와주십시오. 고맙습니다.Android JSON 구문 분석이 작동하지 않습니다.

AndroidJSONParsingActivity.java

package com.example.samplejsonparsing; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class AndroidJSONParsingActivity extends ListActivity { 

    // url to make request 
    private static String url = "http://api.androidhive.info/contacts/"; 

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

    @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(); 

     // getting JSON string from URL 
     JSONObject json = jParser.getJSONFromUrl(url); 

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


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

      } 
     }); 



    } 

} 

JSONParser.java

package com.example.samplejsonparsing; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.util.Log; 

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; 

    } 
} 

SingleMenuItemActivity.java는

package com.example.samplejsonparsing; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.TextView; 

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

어쩌면 그것은 바보 같은 질문 일 수 있지만이를 무시하지 마십시오.

08-08 10:18:50.240: D/AbsListView(14239): Get MotionRecognitionManager 
08-08 10:18:50.285: D/AndroidRuntime(14239): Shutting down VM 
08-08 10:18:50.285: W/dalvikvm(14239): threadid=1: thread exiting with uncaught exception (group=0x40ee32a0) 
08-08 10:18:50.295: E/AndroidRuntime(14239): FATAL EXCEPTION: main 
08-08 10:18:50.295: E/AndroidRuntime(14239): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.samplejsonparsing/com.example.samplejsonparsing.AndroidJSONParsingActivity}: android.os.NetworkOnMainThreadException 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2100) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.os.Looper.loop(Looper.java:137) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.ActivityThread.main(ActivityThread.java:4898) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at java.lang.reflect.Method.invokeNative(Native Method) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at java.lang.reflect.Method.invoke(Method.java:511) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at dalvik.system.NativeStart.main(Native Method) 
08-08 10:18:50.295: E/AndroidRuntime(14239): Caused by: android.os.NetworkOnMainThreadException 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at com.example.samplejsonparsing.JSONParser.getJSONFromUrl(JSONParser.java:38) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at com.example.samplejsonparsing.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:54) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.Activity.performCreate(Activity.java:5206) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
08-08 10:18:50.295: E/AndroidRuntime(14239): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
08-08 10:18:50.295: E/AndroidRuntime(14239): ... 11 more 
08-08 10:19:39.280: I/Process(14239): Sending signal. PID: 14239 SIG: 9 

AndroidManifest를

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.samplejsonparsing" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.example.samplejsonparsing.AndroidJSONParsingActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:label="@string/app_name" 
      android:name="com.example.samplejsonparsing.SingleMenuItemActivity" > 
     </activity> 
    </application> 

</manifest> 
+1

충돌의 Logcat 출력과 함께 정확한 오류를 게시하십시오. –

+0

어떤 종류의 "offtop"이긴하지만 json을 파싱하려면 Google의 gson 라이브러리를 사용하는 것이 좋습니다. 코드가 작아집니다. –

+0

중복 가능한 [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – laalto

답변

0

내가 프로젝트를 다운로드하고 내 시스템에 집계했다. 잘 작동합니다. "인터넷"권한을 추가 한 경우 Manifest.xml을 확인하십시오. 오류가 무엇인지 이해할 수 있도록 여기에 Logcat 출력을 추가하십시오.

+0

Logcat을 추가했습니다. 문제를 해결하는 데 도움주세요. – Kabil

+0

logcat의 다섯 번째 줄을 참조하십시오. 08-08 10 : 18 : 50.295 : E/AndroidRuntime (14239) : java.lang.RuntimeException : 활동을 시작할 수 없습니다. ComponentInfo {com.example.samplejsonparsing /com.example.samplejsonparsing.AndroidJSONParsingActivity} android.os.NetworkOnMainThreadException URL에서 JSON을 가져 오는 네트워크 연결이 기본 UI 프로세스 스레드에서 수행되고 있음을 나타냅니다. Android 4.0 이상의 최신 버전에서는 네트워크 스레드가 비동기 작업을 사용하여 백그라운드 스레드에서 실행되어야합니다. 그렇지 않으면 응용 프로그램이 중단됩니다. – Arshu

+0

비동기 작업을 구현하는 방법. 코드를 제공 할 수 있습니까? – Kabil

관련 문제