2013-11-22 36 views
-2

我正在学习JSON Parser。我遵循androidhive教程并复制它的代码,但可悲的是,我不能。它不会显示任何东西,有这些类型的错误:JSON解析器错误:http客户端失败

11-22 17:27:12.132: E/AndroidRuntime(1938): Caused by: android.os.NetworkOnMainThreadException 

谁能帮我解决这个问题?谢谢。

JSONPaser

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; 

    } 
} 

MainActivity

import android.view.Menu; 

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 MainActivity 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 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_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); 

        } 
       }); 


      } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

在清单

如何使用的AsyncTask或线程与处理程序解决的错误<uses-permission android:name="android.permission.INTERNET" />是使用?我是否需要删除我的JSON解析器类?

事情,我试过至今:

  • 我换我的目标SDK版本,以适应我的模拟器,但它仍然 不起作用
  • 我的手机(三星)和仿真器上运行项目( Genymotion) 它显示出相同的错误
  • 我试图测试的另一种方法,而不JSON阵列

    进口android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.TextView; import android.util.Log;

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

    import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient;

    公共类主要在此代码扩展活动{

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        try{ //try1 start 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        // this is our TextView element, obtained by id from our XML layout 
        TextView myListView = (TextView)findViewById(R.id.netResult); 
    
        //lets try to connect 
         try{ //try2 start 
    
         //create a new client object 
         HttpClient httpclient = new DefaultHttpClient(); 
    
         HttpPost httppost = new HttpPost("http://ephemeraltech.com/demo/android_tutorial20.php"); 
    
         //execute the post and get the response object 
         HttpResponse response = httpclient.execute(httppost); 
    
         //get the message from the response 
         HttpEntity entity = response.getEntity(); 
    
         //get the content of the message 
         InputStream webs = entity.getContent(); 
    
         //convert response to string 
           try{ //try3 start 
           BufferedReader reader = new BufferedReader(new InputStreamReader(webs,"utf-8"),8); 
    
           //read one line of the response 
           myListView.setText(reader.readLine()); 
    
           //slow our inputStream 
           webs.close(); 
           }//try3 end 
         catch (Exception e){//catch 3 start 
          Log.e("log_result", "Error converting result "+e.toString()); 
         }//catch 3 end 
    
         } //try2 end 
         catch (Exception e){//catch 2 start 
          Log.e("log_connect", "Error in http connection "+e.toString()); 
         } 
        }//try1 end 
        catch (Exception e){ //catch 1 start 
         //this is the lie of code that sends a real error message to the log 
         Log.e("ERROR", "ERROR IN CODE: "+e.toString()); 
         e.printStackTrace(); 
        }//catch 1 end 
    } 
    
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.main, menu); 
        return true; 
    } 
    

    }

的logcat的抓住我的第二次尝试和打印log_connect,错误的HTTP连接

+0

来提高你的问题,更好地展现了'Code' ..你做了什么,得到了错误,你已经试过了,链接教程你曾经这样做..等 –

+0

可能重复的[android.os.NetworkOnMainThreadException](http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) –

+0

对不起,我不明白题外话的意义。我是新来的,如果没有适当的指导,我无法学习android,我无法定义这个问题。请原谅我的愚蠢,并帮助英寸这个问题谢谢 – Jing

回答

0

你看了堆栈跟踪?

产生的原因:android.os.NetworkOnMainThreadException

如果你在即使有一派 “NetworkOnMainThreadException” 你会得到答案。

总之,原因是你正在主线程上执行一个HTTP请求,这实际上是一个糟糕的做法。 Android最近变得更加严格并引发异常。

你需要的是这样的:

new AsyncTask<CustomParamClass, Void, String>() { 
    @Override 
    protected String doInBackground(final CustomerParamClass... params) { 
     //use params to get the data and make an HHTP Request. 
    } 

    @Override 
    protected void onPostExecute(final String params) { 
     // This is invoked on the main thread. Communicate here. 
    } 
}.execute(<pass some params here>); 
+0

sry即时在Android的新,刚刚开始学习上个月。但我应该在哪里放这个方法?主类或JSON解析器类 – Jing

+0

您应该将此方法放在您的主类中,以便您可以执行此类。 – Piyush