2011-01-17 12 views
0

httpGetまたはhttpPostを使用して私のサーバにいくつかのパラメータを送り、クライアントがサーバに接続されていればうまく動作します。しかし、そうでないときは、私のアプリがクラッシュします。サーバーが接続されていないとアプリがクラッシュするのはなぜですか?

((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 
+0

'logcat'を見て、どの行がクラッシュしているのか確認しましたか? – xil3

+0

さらに詳しい情報が必要です。エラーについてのより詳細な情報を提供できますか?おそらくスタックトレースですか? –

+0

私はlogCagで投稿を編集しました – user420574

答えて

1

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

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

+0

私はパラメータと混同しているので、どのようにAsyncTaskを使用することができますか?例:doString(String ... params) – user420574

+0

http://developer.android.com/reference/android/os/の例を参照してください。 AsyncTask.html。最も重要な機能を覚えていてください... doInBackground()は別のスレッドで動作し、メインスレッドだけがそれを行うことができるため、UIを更新してはいけません。 doInBackground()から返されたもの(ダウンロード結果)はUIスレッドで実行され、安全にUIを更新できるonPostExecute()に渡されます。 –

+0

NB:バックグラウンド関数でint、Foos、MyDownloadDataType []を使用したり、実行する必要のある作業に最適なものを作成したい場合など、doInBackgroundの戻り値とパラメータの型はテンプレート化されています。 –

0

クイック推測:のtry/catchであなたのfinallyブロックでは、あなたが、私は私のコードでのtry/catch ...

顔をしていますただIOExceptionを捕まえています。たぶん.close()bufferedReaderに呼び出すと、別の例外がスローされますか?

1

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

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

+0

ありがとう! AsyncTaskの使い方を調べてみましょう。 – user420574

関連する問題