2011-01-17 5 views
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 
+0

Вы посмотрели на свой 'logcat', чтобы увидеть, в какую строку он врезался? – xil3

+0

Нам нужна дополнительная информация. Не могли бы вы дать нам больше указаний об ошибке, может быть, stacktrace? –

+0

Я отредактировал сообщение с logCag – user420574

ответ

1

У вас возникла ошибка «Применение не отвечает» (ANR). Это происходит из-за того, что вы выполняете сетевую операцию ввода-вывода в основном потоке, который всегда является «нет-нет». Если нет сетевого подключения, он будет блокироваться, пока не истечет время.

Всегда используйте AsyncTask для загрузки.

+0

У вас есть пример, как я могу использовать AsyncTask, потому что меня путают с параметрами: protected String doInBackground (String ... params) – user420574

+0

См. Пример на http://developer.android.com/reference/android/os/ AsyncTask.html. Помните самые важные функции ... doInBackground() работает в отдельном потоке и не должен обновлять интерфейс, потому что только основной поток может это сделать. То, что вы возвращаете из doInBackground() (то есть результаты вашей загрузки), будет передано onPostExecute(), которое запускается в потоке пользовательского интерфейса и из которого вы можете безопасно обновлять пользовательский интерфейс. –

+0

NB: Оба типа возвращаемых данных и параметров doInBackground являются шаблонами, потому что вы можете захотеть использовать фоновые функции и возвращать ints, или Foos, или MyDownloadDataType [], или любые типы, которые лучше всего подходят для работы, которая должна быть выполнена. –

0

Быстрый догадка: в Try/улова в вашей наконец блок, вы «Только ловить IOException. Может быть, вызов .close() на bufferedReader вызывает другое исключение?

1

Ваш код генерирует исключение Android Not Responsponding (ANR), поскольку вы отправляете свои HTTP-запросы в поток пользовательского интерфейса. Вы должны убедиться, что поток пользовательского интерфейса всегда реагирует на пользователя. Этого не происходит, когда ваш сервер подключен, потому что ответ достаточно быстрый, но при тайм-ауте или другой проблеме вы будете получать это каждый раз.

Ответ заключается в том, чтобы использовать что-то вроде AsyncTask для отправки ваших HTTP-запросов в другом потоке.

+0

Спасибо! Я попытаюсь выяснить, как использовать AsyncTask. – user420574