JSON पार्सर त्रुटि: http क्लाइंट विफलता

मैं JSON पार्सर सीख रहा हूं। मैं एंड्रॉइड ट्यूटोरियल का पालन करता हूं और उसका कोड कॉपी करता हूं, लेकिन दुख की बात है, मैं नहीं कर सकता। यह कुछ भी प्रदर्शित नहीं करता है और इन प्रकार की त्रुटियां हैं:

 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;

    }
}

मुख्य गतिविधि

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 मुख्य गतिविधि 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> contactList = new ArrayList>();

               //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 map = new HashMap();

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

}

is use in Manifest

त्रुटि को हल करने के लिए मैं हैंडलर के साथ AsyncTask या थ्रेड का उपयोग कैसे कर सकता हूं ?? क्या मुझे अपना JSON पार्सर क्लास हटाने की ज़रूरत है ??

जिन चीजों को मैंने अभी तक आजमाया है:

  • i switched i target SDK version to fit my emulator but it still doesn't work
  • i run the project on my phone (Samsung) and emulator (Genymotion) it show the same error
  • i tried to test another method without JSON Array

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

    public class Main extends Activity {

    @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 कनेक्शन में त्रुटि

2
जोड़ा संपादित
विचारों: 1
अपने प्रश्न को बेहतर बनाने के लिए, बेहतर कोड दिखाएं .. आपने त्रुटि प्राप्त करने के लिए क्या किया है, जो आपने पहले ही कोशिश की है, ट्यूटोरियल का लिंक जो आपने इसे किया था .. आदि।
जोड़ा लेखक Paulo Roberto, स्रोत
मुझे खेद है कि मैं विषय के अर्थ को समझ नहीं पा रहा हूं। मैं नया हूं और मैं उचित मार्गदर्शन के बिना एंड्रॉइड सीख रहा हूं, मैं समस्या को परिभाषित नहीं कर सकता। कृपया मेरी मूर्खता को क्षमा करें और इस समस्या के साथ मील की मदद करें धन्यवाद
जोड़ा लेखक Jing, स्रोत
android.os.NetworkOnMainThreadException का संभावित डुप्लिकेट
जोड़ा लेखक Tanis.7x, स्रोत

2 उत्तर

आपके पास NetworkOnMainThreadException त्रुटि है।

इसका मतलब है कि आपने सीधे अपना कोड onCreate विधि पर चलाया है:

लेकिन आप सीधे अपने डेटा को MainUI धागा पर अपडेट नहीं कर सकते हैं।

For that you have to use AsyncTask or Thread with Handler or update your UI with runOnUiThread()

You can go with this: http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

0
जोड़ा
धन्यवाद 4 जानकारी
जोड़ा लेखक Jing, स्रोत

क्या आपने स्टैक ट्रेस को बिल्कुल पढ़ा था?

के कारण: android.os.NetworkOnMainThreadException

यदि आपने "NetworkOnMainThreadException" के साथ भी गुगल किया था तो आपको जवाब मिल गया होगा।

संक्षेप में, कारण यह है कि आप मुख्य धागे पर एक HTTP अनुरोध कर रहे हैं जो वास्तव में एक बुरा अभ्यास है। एंड्रॉइड हाल ही में अधिक प्रतिबंधक बन गया है और अपवाद फेंकता है।

आपको इसकी आवश्यकता कुछ है:

new AsyncTask() {
    @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();
0
जोड़ा
आपको इस विधि को अपनी मुख्य कक्षा में रखना चाहिए जहां आप इस कक्षा को निष्पादित कर सकते हैं।
जोड़ा लेखक Piyush, स्रोत
एंड्रॉइड में नया आई, मैं पिछले महीने सीखना शुरू कर दिया। लेकिन मुझे यह तरीका कहां रखना चाहिए ?? मुख्य वर्ग या जेएसओएन पार्सर कक्षा
जोड़ा लेखक Jing, स्रोत