简体   繁体   English

Android asynctask json解析发生错误android.os.NetworkOnMainThreadException

[英]Android asynctask json parsing getting error android.os.NetworkOnMainThreadException

I'm new to android, and i try to parse json from url using such class: 我是android的新手,我尝试使用此类从URL解析json:

package com.***.exchanger;

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.HttpGet;
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;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet httpPost = new HttpGet(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, "UTF-8"), 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;

    }
}

and when i was parsing without asynctask - all was good, i get json results, etc... 当我没有asynctask进行解析时-一切都很好,我得到了json结果,等等...

But now my code is such: 但是现在我的代码是这样的:

public class ExchangerListActivity extends ListActivity {

    private static String url;


    private static final String TAG_BANKS = "bank";
    private static final String TAG_ID = "id";
    private static final String TAG_NAME = "name";
    private static final String TAG_Exc_count = "exch_count";
    private static final String TAG_central_office_address = "central_office_address";
    JSONArray banks = null;
    JSONObject json;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_exchanger_list);
        url = "http://192.168.1.4:3000/banks.json";
        JSONParser jParser = new JSONParser();    
        JSONObject json = jParser.getJSONFromUrl(url);

        ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
        listViewLoaderTask.execute(json);
    }


     private class ListViewLoaderTask extends AsyncTask<JSONObject, Void, ListAdapter>{

            JSONObject jObject;
            /** Doing the parsing of xml data in a non-ui thread */
            @Override
            protected ListAdapter doInBackground(JSONObject... strJson) {

                url = "http://192.168.1.4:3000/banks.json";

                ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();


                JSONParser jParser = new JSONParser();


                JSONObject json = jParser.getJSONFromUrl(url);

                try {

                    banks = json.getJSONArray(TAG_BANKS);


                    for(int i = 0; i < banks.length(); i++){
                        JSONObject c = banks.getJSONObject(i);

                        String id = c.getString(TAG_ID);
                        String name = c.getString(TAG_NAME);
                        String central_office_address = c.getString(TAG_central_office_address);
                        String exchangers_list_count = c.getString(TAG_Exc_count);

                        HashMap<String, String> map = new HashMap<String, String>();

                        map.put(TAG_ID, id);
                        map.put(TAG_NAME, name);
                        map.put(TAG_central_office_address, central_office_address);
                        map.put(TAG_Exc_count, exchangers_list_count);

                        contactList.add(map);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                final ListAdapter adapter = new SimpleAdapter(ExchangerListActivity.this, contactList,
                        R.layout.bank_list,
                        new String[] { TAG_NAME, TAG_central_office_address, TAG_Exc_count }, new int[] {
                                R.id.bank_name, R.id.central_office_address, R.id.exchangers_list_count});

                return adapter;
            }

            /** Invoked by the Android system on "doInBackground" is executed completely */
            /** This will be executed in ui thread */
            @Override
            protected void onPostExecute(ListAdapter adapter) {

                /** Getting a reference to listview of main.xml layout file */
                ListView listView = ExchangerListActivity.this.getListView();

                /** Setting the adapter containing the country list to listview */
                listView.setAdapter(adapter);
                //setListAdapter(adapter);
/*
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
*/
        @SuppressWarnings("unchecked")
        @Override
        public void onItemClick(AdapterView<?> parent, android.view.View view,
                int position, long id) {
            Intent in = new Intent(getApplicationContext(), BankExchangersListActivity.class);
            String a = ((Map<String, String>) adapter.getItem(position)).get(TAG_ID);
            in.putExtra("Bank_id", a);
            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.exchanger_list, menu);
        return true;
    }

}

and then i get errors: 然后我得到错误:

05-02 20:16:21.749: E/AndroidRuntime(4057): FATAL EXCEPTION: main
05-02 20:16:21.749: E/AndroidRuntime(4057): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pavel.exchanger/com.pavel.exchanger.ExchangerListActivity}: android.os.NetworkOnMainThreadException
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.os.Looper.loop(Looper.java:137)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.ActivityThread.main(ActivityThread.java:5041)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at java.lang.reflect.Method.invokeNative(Native Method)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at java.lang.reflect.Method.invoke(Method.java:511)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at dalvik.system.NativeStart.main(Native Method)
05-02 20:16:21.749: E/AndroidRuntime(4057): Caused by: android.os.NetworkOnMainThreadException
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at libcore.io.IoBridge.connect(IoBridge.java:112)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at java.net.Socket.connect(Socket.java:842)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at com.pavel.exchanger.JSONParser.getJSONFromUrl(JSONParser.java:39)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at com.pavel.exchanger.ExchangerListActivity.onCreate(ExchangerListActivity.java:45)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.Activity.performCreate(Activity.java:5104)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-02 20:16:21.749: E/AndroidRuntime(4057):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-02 20:16:21.749: E/AndroidRuntime(4057):     ... 11 more

what i'm doing wrong? 我做错了什么? How to run my activity for json parsing and displaying? 如何运行我的活动以进行JSON解析和显示?

what i'm doing wrong? 我做错了什么?

You are calling getJSONFromUrl() from onCreate() of your activity (see line 45 of ExchangerListActivity.java ). 您正在从活动的onCreate()调用getJSONFromUrl() (请参阅ExchangerListActivity.java第45行)。 This is in addition to your getJSONFromUrl() in your AsyncTask . 这是对AsyncTask getJSONFromUrl()补充。 Presumably you forgot to delete the case where you were calling it in onCreate() . 大概您忘记了删除在onCreate()中调用它的情况。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 android.os.NetworkOnMainThreadException进入AsyncTask - android.os.NetworkOnMainThreadException into AsyncTask AsyncTask中的android.os.NetworkOnMainThreadException - android.os.NetworkOnMainThreadException in AsyncTask 错误:使用asynctask时出现android.os.NetworkOnMainThreadException - Error: android.os.NetworkOnMainThreadException while using asynctask android.os.NetworkOnMainThreadException错误,即使在AsyncTask中运行 - android.os.NetworkOnMainThreadException error even when running in AsyncTask android.os.NetworkOnMainThreadException但我使用了AsyncTask - android.os.NetworkOnMainThreadException but i used AsyncTask 中的Android.OS.NetworkOnMainThreadException - Android.OS.NetworkOnMainThreadException in 我的JSON请求响应类中的android.os.networkonmainthreadexception错误 - android.os.networkonmainthreadexception error in my request response class for JSON 在主线程上解析XML,但通过AsyncTask下载-“无效的流或编码:android.os.NetworkOnMainThreadException” - Parsing XML on main thread but downloaded via AsyncTask - “Invalid stream or encoding: android.os.NetworkOnMainThreadException” 即使在AsyncTask中运行,也会出现“ android.os.NetworkOnMainThreadException” - “android.os.NetworkOnMainThreadException” even when running in AsyncTask 改造 - android.os.NetworkOnMainThreadException - Retrofit - android.os.NetworkOnMainThreadException
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM