【问题标题】:ThreadException - Trying to receive data from a websiteThreadException - 试图从网站接收数据
【发布时间】:2012-01-03 23:47:03
【问题描述】:

我现在正在开发一个应用程序 1 周。不幸的是,有一个很难解决的错误,因为我现在真的不知道该怎么做。请参阅下面的 LogCat 列表副本。

01-04 00:14:23.662: E/log_tag(3073): Error in http connectionandroid.os.NetworkOnMainThreadException
01-04 00:14:23.662: E/log_tag(3073): Error converting result java.lang.NullPointerException
01-04 00:14:23.672: D/AndroidRuntime(3073): Shutting down VM
01-04 00:14:23.672: W/dalvikvm(3073): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
01-04 00:14:23.692: E/AndroidRuntime(3073): FATAL EXCEPTION: main
01-04 00:14:23.692: E/AndroidRuntime(3073): java.lang.RuntimeException: Unable to start activity ComponentInfo{united.aristal.freewallet/united.aristal.freewallet.GroupHistory}: java.lang.NullPointerException
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.ActivityThread.access$600(ActivityThread.java:122)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.os.Looper.loop(Looper.java:137)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.ActivityThread.main(ActivityThread.java:4340)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at java.lang.reflect.Method.invokeNative(Native Method)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at java.lang.reflect.Method.invoke(Method.java:511)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at dalvik.system.NativeStart.main(Native Method)
01-04 00:14:23.692: E/AndroidRuntime(3073): Caused by: java.lang.NullPointerException
01-04 00:14:23.692: E/AndroidRuntime(3073):     at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at org.json.JSONTokener.nextValue(JSONTokener.java:94)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at org.json.JSONArray.<init>(JSONArray.java:87)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at org.json.JSONArray.<init>(JSONArray.java:103)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at united.aristal.freewallet.GroupHistory.retrieveGroupInfo(GroupHistory.java:295)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at united.aristal.freewallet.GroupHistory.onCreate(GroupHistory.java:95)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.Activity.performCreate(Activity.java:4465)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
01-04 00:14:23.692: E/AndroidRuntime(3073):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
01-04 00:14:23.692: E/AndroidRuntime(3073):     ... 11 more

当前问题所在的脚本副本:

/********************************************************************
* RETRIEVING GROUP INFO                                             *
*********************************************************************/
public void retrieveGroupInfo(){

    try{
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("link");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        }
    catch(Exception e){
        Log.e("log_tag", "Error in http connection"+e.toString());
    }

    try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            sb = new StringBuilder();
            sb.append(reader.readLine() + "\n");
            String line="0";

            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n\n");
            }

            is.close();
            result = sb.toString();
    }
    catch(Exception e){
        Log.e("log_tag", "Error converting result "+e.toString());
    }

    try{
        jArray = new JSONArray(result);
        JSONObject json_data=null;

        for(int i = 0; i < jArray.length(); i++){

            json_data               = jArray.getJSONObject(i);     

            retrievedId.add(json_data.getInt("id"));
            String getDate          = recoverDate(json_data.getString("date"));
            String getTime          = json_data.getString("time");
            String getCategory      = json_data.getString("category");
            String getObjectName    = json_data.getString("object_name");
            String getObjectVal     = json_data.getString("object_value");
            String getValType       = json_data.getString("value_type");
            //String getUsername        = json_data.getString("username");

            historyItems.add(
                    getCategory + "\t: " + getObjectName + "\n" + 
                    "Price\t: € " + getObjectVal + "\n" +
                    "Date\t: " + getDate + " " + getTime);

            historyValueType.add(getValType);
        }

        ListView lv = (ListView) findViewById(R.id.listViewMenu);
            lv.setAdapter(fancyAdapter);

            lv.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                    alertdialogUpdateDelete(position);
                    //showToast(historyItem.get(position).toString());
                }
            });
    }
    catch(JSONException e1){
        //Toast.makeText(getBaseContext(), "No Record Found." ,Toast.LENGTH_LONG).show();
    } 
    catch (ParseException e1) {
            e1.printStackTrace();
    }

}

我现在真的很沮丧,卡了几个小时,所以请帮助我。我不确定,但我认为线程或其他东西有问题?感谢您在这里帮助我。

【问题讨论】:

    标签: android json http


    【解决方案1】:

    您的代码正在尝试在主线程上建立网络连接。这在 Android 中是不允许的;这就是您尝试连接时收到android.os.NetworkOnMainThreadException 的原因。捕获异常并将其记录后,您的代码仍会尝试使用它,这会导致以下问题。 (如果在建立连接时发现异常,您可能应该报告失败并跳过尝试读取连接。)

    解决方案是将您的网络活动移至工作线程。 AsyncTask 是一个很好的方法。阅读指南主题Processes and Threads 和博客条目Painless threading 了解更多信息。

    【讨论】:

    • "如果在建立连接时发现异常,您可能应该报告失败并跳过尝试读取连接。"我怎样才能做到这一点?你能举个例子吗?
    • @Xonarial - 在catch 子句中调用Log.e() 后,只需从retrieveGroupInfo 返回。 (您可以更改该方法以返回一个指示成功或失败的布尔值。)请注意,您需要更改您的代码以不再从onCreate 调用retrieveGroupInfo。相反,如果你使用 AsyncTask(我推荐),你可以写 onPostExecute 来弹出一个对话框,告诉用户坏消息,然后在对话框关闭时调用 finish()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多