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
4

3 回答 3

1

您的代码抛出 Android 无响应 (ANR) 异常,因为您在 UI 线程上发出 HTTP 请求。您必须确保 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 回答