2013-08-08 2 views
0

Я использую Androidhive учебники для получения данных из файла JSON и просмотра его в виде списка или сетки. Но при запуске этого приложения приложение выходит из строя и выходит. Я не мог найти ошибки в коде. Вы можете загрузить исходный код из приведенной выше ссылки на учебник. Однако я предоставил файлы классов здесь. Пожалуйста, помогите мне решить проблему как можно скорее. Заранее спасибо.Android JSON Parsing не работает

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

Какой-то «оффтоп», но я бы порекомендовал вам использовать gson-библиотеку из Google для анализа json. Код будет меньше. –

+0

Возможный дубликат [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – laalto

ответ

0

Я скачал проект и компилируется на моей системе. Его работа прекрасна. Пожалуйста, проверьте свой Manifest.xml, если вы добавили разрешение «ИНТЕРНЕТ». Пожалуйста, добавьте свой вывод Logcat здесь, чтобы можно было понять, что такое ошибка.

+0

Я добавил Logcat. Пожалуйста, помогите решить это – Kabil

+0

Смотрите в вашей пятой строке логарифма: 08-08 10: 18: 50.295: E/AndroidRuntime (14239): java.lang.RuntimeException: не удалось запустить Activity ComponentInfo {com.example.samplejsonparsing /com.example.samplejsonparsing.AndroidJSONParsingActivity}: android.os.NetworkOnMainThreadException Указывает, что сетевое соединение для получения JSON из URL-адреса выполняется в основном потоке процесса пользовательского интерфейса. В последней версии Android 4.0 и выше сетевой поток должен запускаться в фоновом потоке с помощью задачи Async или приложение будет аварийно завершено. – Arshu

+0

Как реализовать задачу Async. Можете ли вы предоставить код? – Kabil