0

httpGet または httpPost を使用していくつかのパラメーターをサーバーに送信すると、クライアントがサーバーに接続されているときに正常に動作します。しかし、そうでない場合、アプリがクラッシュします。ただし、try/catchがあります...

私のコードを見てください:

 ((ImageButton)findViewById(R.id.pickSurnom)).setOnClickListener(new OnClickListener(){

                    public void onClick(View v) {


                            AlertDialog.Builder alert = new AlertDialog.Builder(Postit.this);

                            alert.setTitle("Modifier votre surnom");
                            //alert.setMessage("Message");

                            // Set an EditText view to get user input 
                            final EditText input = new EditText(Postit.this);
                            alert.setView(input);

                            alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {

                                    String surnom = input.getText().toString();                                     


                            //Recuperation "id" du user dans les préférences partagées
                                    SharedPreferences prefs = getPreferences(Context.MODE_PRIVATE);
                                    String id = prefs.getString("id", null);



                            //------------------------ENVOI----------------------------

                            StringBuffer stringBuffer = new StringBuffer("");
                            BufferedReader bufferedReader = null;

                                    try {
                                            HttpClient httpClient = new DefaultHttpClient();
                                    HttpGet httpGet = new HttpGet();

                                    //httpGet.setURI(new URI("http://192.168.0.1:8888/user/public"+"?"+"surnom="+((TextView) findViewById(R.id.surnom)).getText().toString()));
                                    httpGet.setURI(new URI("http://192.168.0.1:8888/user"+"?"+"id="+id+"surnom="+ surnom ));

                                    HttpResponse httpResponse = httpClient.execute(httpGet);
                                    bufferedReader = new BufferedReader(
                                                                    new InputStreamReader(httpResponse.getEntity().getContent()));

                                                    String ligneLue = bufferedReader.readLine();

                                                    Toast.makeText(getApplicationContext(), "id="+bufferedReader.readLine() , Toast.LENGTH_LONG).show();

                                                    while (ligneLue!=null){
                                                            stringBuffer.append(ligneLue);
                                                            ligneLue = bufferedReader.readLine(); 

                                                            //Si la réponse = True
                                                            //Remplir le bon surnom dans le TextView
                                                            ((TextView) findViewById(R.id.surnom)).setText(surnom);

                    }


                            } catch (Exception e){
                                    Toast.makeText(getApplicationContext(), "Connection error", Toast.LENGTH_LONG).show();
                                    Log.e("Exception1", e.getMessage());

                            } finally {
                                    if (bufferedReader !=null){
                                            try{
                                                    bufferedReader.close();
                                                    Toast.makeText(getApplicationContext(), "Serveur indisponible" + surnom, Toast.LENGTH_LONG).show();

                                            } catch (IOException e){
                                                    Log.e("Exception2", e.getMessage());
                                            }
                                    }
                            }

                            Log.i("Exception3", stringBuffer.toString());

マイ LogCat

01-17 15:45:00.801: ERROR/ActivityManager(58): ANR in com.branchu1 (com.branchu1/.Postit)
01-17 15:45:00.801: ERROR/ActivityManager(58): Reason: keyDispatchingTimedOut
01-17 15:45:00.801: ERROR/ActivityManager(58): Load: 0.5 / 0.18 / 0.08
01-17 15:45:00.801: ERROR/ActivityManager(58): CPU usage from 32503ms to 56ms ago:
01-17 15:45:00.801: ERROR/ActivityManager(58):   system_server: 19% = 15% user + 3% kernel / faults: 2075 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   ndroid.launcher: 3% = 2% user + 0% kernel / faults: 1554 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   adbd: 1% = 0% user + 0% kernel
01-17 15:45:00.801: ERROR/ActivityManager(58):   ndroid.settings: 0% = 0% user + 0% kernel / faults: 124 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   m.android.phone: 0% = 0% user + 0% kernel / faults: 56 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   ronsoft.openwnn: 0% = 0% user + 0% kernel / faults: 43 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   logcat: 0% = 0% user + 0% kernel / faults: 1 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   events/0: 0% = 0% user + 0% kernel
01-17 15:45:00.801: ERROR/ActivityManager(58):   android.protips: 0% = 0% user + 0% kernel / faults: 23 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   zygote: 0% = 0% user + 0% kernel / faults: 135 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   .quicksearchbox: 0% = 0% user + 0% kernel / faults: 27 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   id.defcontainer: 0% = 0% user + 0% kernel / faults: 24 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   com.android.mms: 0% = 0% user + 0% kernel / faults: 25 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   m.android.music: 0% = 0% user + 0% kernel / faults: 23 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   d.process.media: 0% = 0% user + 0% kernel / faults: 25 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   m.android.email: 0% = 0% user + 0% kernel / faults: 34 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):   com.svox.pico: 0% = 0% user + 0% kernel / faults: 23 minor
01-17 15:45:00.801: ERROR/ActivityManager(58):  +com.branchu1: 0% = 0% user + 0% kernel
01-17 15:45:00.801: ERROR/ActivityManager(58):  -com.branchu1: 0% = 0% user + 0% kernel
01-17 15:45:00.801: ERROR/ActivityManager(58): TOTAL: 33% = 25% user + 8% kernel + 0% softirq
4

3 に答える 3

1

UIスレッドでHTTPリクエストを発行しているため、コードはAndroid Not Responding(ANR)例外をスローしています。UIスレッドが常にユーザーに応答することを確認する必要があります。応答が十分に速いため、サーバーが接続されている場合は発生しませんが、タイムアウトまたはその他の問題が発生すると、毎回これが発生します。

答えは、AsyncTaskのようなものを使用して、別のスレッドでHTTPリクエストを発行することです。

于 2011-01-17T15:55:31.670 に答える
1

「アプリケーションが応答していません」(ANR)エラーが発生しました。これは、メインスレッドでネットワークIOを実行しているためです。これは、常にノーノーです。ネットワーク接続がない場合は、タイムアウトになるまでブロックされます。

ダウンロードには常にAsyncTaskを使用してください。

于 2011-01-17T15:55:54.510 に答える
0

簡単な推測: finally ブロックの try/catch では、キャッチしているのはIOException. 呼び出す.close()bufferedReader、別の例外がスローされる可能性がありますか?

于 2011-01-17T15:52:26.117 に答える