2011-01-17 7 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()); 

내 로그 캣

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 (Application Not Responding)"오류가 발생했습니다. 이것은 메인 스레드에서 네트워크 IO를 수행하고 있기 때문입니다.이 스레드는 항상 no-no입니다. 네트워크에 연결되어 있지 않으면 시간이 초과 될 때까지 차단됩니다.

항상 AsyncTask를 다운로드하여 사용하십시오.

+0

매개 변수와 혼동되기 때문에 AsyncTask를 어떻게 사용할 수 있는지 예가 있습니까? protected String doInBackground (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

빠른 추측 :의 시도/캐치에 마침내 당신, 차단 단지 IOException을 붙잡고 있습니다. 어쩌면 을 bufferedReader에 전화하면 다른 예외가 발생합니까?

1

UI 스레드에서 HTTP 요청을 실행 중이므로 코드에서 ANR (Android Not Responding) 예외가 발생합니다. UI 스레드가 항상 사용자에게 응답하는지 확인해야합니다. 응답이 빠르기 때문에 서버가 연결될 때 발생하는 것은 아니지만 시간 초과 또는 기타 문제가 발생할 때마다이를 얻습니다.

대답은 AsyncTask과 같은 것을 사용하여 HTTP 요청을 다른 스레드에서 발행하는 것입니다.

+0

고마워요! AsyncTask를 사용하는 방법을 찾으려고 노력할 것입니다. – user420574

관련 문제