1

私は最近、ウェブサーバーからAndroidデバイスにデータを接続して解析し、froyoとgingerbreadでテストし、正常に動作しますが、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そしてそれは一般的に貧弱なコードのサインです、そしてそれはそれが何らかのネットワーク活動を実行しているときはいつでもアプリケーションがロックするので悪いユーザーエクスペリエンスをもたらすでしょう。はい、それは(残念ながら)Honeycomb以前のデバイスで動作しますが、誰もが望んでいることではありません。

問題を解決するには、単一のHTTP呼び出しを使用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

NetworkOnMainThreadException を取得するコードで Asynctask を使用すると、ics だけでなくハニカムでも同じ例外が発生します。

于 2012-08-14T06:27:06.643 に答える