1

我最近开发了一个应用程序,该应用程序将来自网络服务器的数据连接并解析到安卓设备中,在 froyo 和姜饼上进行了测试,运行良好,但在 ICS 设备上崩溃。至于 UI,我使用了 gingebread 对象,所以我认为这不是问题。

即使在连接到 facebook 后,它在第一次运行时也能正常工作,但在获取和解析所有收集的 JSON 数据的部分出现错误。

这是直接来自设备的 logcat 错误:

E/AndroidRuntime(25620): FATAL EXCEPTION: Thread-9660
E/AndroidRuntime(25620): java.lang.UnsupportedOperationException
E/AndroidRuntime(25620):        at java.lang.Thread.stop(Thread.java:1076)
E/AndroidRuntime(25620):        at java.lang.Thread.stop(Thread.java:1063)
E/AndroidRuntime(25620):        at com.android.guestlist.SplashScreen$1.run(Spla
shScreen.java:89)
E/android.os.Debug( 2090): !@Dumpstate > dumpstate -k -t -n -z -d -o /data/log/d
umpstate_app_error

E/Launcher(18546): Error finding setting, default accessibility to not found: ac
cessibility_enabled

E/log_tag (25620): Error in http connection android.os.NetworkOnMainThreadExcept
ion

E/log_tag (25620): Error converting result java.lang.NullPointerException

E/log_tag (25620): Error parsing data org.json.JSONException: End of input at ch
aracter 0 of

E/log_tag (25620): Error in http connection android.os.NetworkOnMainThreadExcept
ion

E/log_tag (25620): Error converting result java.lang.NullPointerException

E/log_tag (25620): Error in http connection android.os.NetworkOnMainThreadExcept
ion

E/log_tag (25620): Error parsing data org.json.JSONException: End of input at ch
aracter 0 of

这是我的 JSON 解析器,因为我认为这是问题发生的地方?哦,我创建的日志甚至没有出现在电话日志中我真的不能说,但这里是代码:

public void getDataFromWeb(String a, String b){
        String result = "";

        Log.v(TAG, "Name Value Pair a " + a);
        Log.v(TAG, "Name Value Pair b " + b);

        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

        nameValuePairs.add(new BasicNameValuePair("a_param",a));
        nameValuePairs.add(new BasicNameValuePair("b_param",b));

             try{
                     HttpClient httpclient = new DefaultHttpClient();
                     HttpPost httppost = new HttpPost("http://[mywebserviceshere].php");
                     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                     HttpResponse response = httpclient.execute(httppost);
                     HttpEntity entity = response.getEntity();
                     is = entity.getContent();
                     Log.v(TAG, "connected");
             }catch(Exception e){
                     Log.v(TAG, "run failed");

                     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();
                     String line = "0";

                     while ((line = reader.readLine()) != null) {
                             sb.append(line + "\n");
                     }
                     is.close();
                     result=sb.toString(); 
                     Log.v(TAG, "buffered read");
             }catch(Exception e){
                 Log.v(TAG, "buffered error");
                     Log.e("log_tag", "Error converting result "+e.toString());
             }

             try{
                 Log.v(TAG, result);

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

                     for(int i=0;i<jArray.length();i++){
                         Log.v(TAG, "loop start");

                             json_data = jArray.getJSONObject(i);
                             w.add(json_data.getString("w_data"));
                             x.add(json_data.getString("x_data"));
                             y.add(json_data.getString("y_data"));
                             z.add(json_data.getString("y_data"));
                             Log.v(TAG, "list added");
                     }

             }catch(JSONException e){
                 w.add("0");
                 x.add("No Data");
                 y.add("No Data");
                 z.add("No Data");
                 Log.v(TAG, "rest failed");
                     Log.e("log_tag", "Error parsing data "+e.toString());
             }


    }

最后,这正是 AVD 中的样子:

在此处输入图像描述

这是 ICS 的问题还是我必须修改我的一些代码?

4

3 回答 3

4

你有一个NetworkOnMainThreadException,这通常是代码糟糕的标志,它会导致糟糕的用户体验,因为应用程序在运行某种网络活动时会锁定。是的,它(不幸的是)适用于蜂窝之前的设备,但这不是任何人都应该追求的。

为了解决您的问题,我强烈建议您使用单个AsyncTask并在该方法中执行所有 HTTP 调用doInBackground()。完成后,onPostExecute()将自动调用该方法,因此您可以更新 GUI。非常简单。

在做任何其他事情之前,请查看文档AsyncTask并理解它。我相信这将非常适合您的应用程序:http: //developer.android.com/reference/android/os/AsyncTask.html

所以不 - 这不是冰淇淋三明治的问题。它根本不允许您在主线程上发出网络请求,因为它可以阻止其他所有内容。

(这与我几天前回答的另一个问题非常相似,因此部分答案是从那里复制的:https ://stackoverflow.com/a/11897381/762442 )

于 2012-08-14T06:18:16.313 回答
1

您收到此异常是因为您在主线程中执行网络操作

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://[mywebserviceshere].php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();

这在 Honeycomb 之前是允许的,但在 honeycomb 之后这已经停止,如果你这样做,你会得到NetworkOnMainThreadException

所以最好使用AsyncTask。使用它,您可以在后台线程(除了主线程)中执行网络操作。

要了解更多AsyncTask工作原理,请参阅此链接

于 2012-08-14T06:28:26.957 回答
0

在你的代码中使用 Asynctask 你得到 NetworkOnMainThreadException ,不仅使用 ics ,而且使用 honeycomb 它会给你同样的异常。

于 2012-08-14T06:27:06.643 回答