ThreadException - 尝试从网站接收数据

时间:2012-01-03 23:47:03

标签: android json http

有一个应用程序,我现在正在工作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();
    }

}

我现在非常沮丧并且坚持了几个小时,所以请帮助我。我不确定,但我认为线程或某些问题存在问题? Thanx在这里帮助我。

1 个答案:

答案 0 :(得分:3)

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

解决方案是将您的网络活动移至工作线程。 AsyncTask是一种很好的方法。有关详细信息,请参阅指南主题Processes and Threads和博客条目Painless threading

相关问题