【问题标题】:Why does my app crash when my server is not connected?为什么我的服务器未连接时我的应用程序崩溃?
【发布时间】:2011-06-10 12:39:21
【问题描述】:

我使用 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());

我的日志猫

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

【问题讨论】:

  • 你查看过你的logcat 看看它在哪一行崩溃了吗?
  • 我们需要更多信息。你能给我们更多关于错误的精确度吗,也许是堆栈跟踪?
  • 我用 logCag 编辑了帖子

标签: android exception try-catch http-post http-get


【解决方案1】:

您收到“应用程序无响应”(ANR) 错误。这是因为您在主线程上执行网络 IO,这始终是禁忌。如果没有网络连接,它将阻塞直到超时。

始终使用 AsyncTask 进行下载。

【讨论】:

  • 你有任何示例我如何使用 AsyncTask,因为我对参数感到困惑:protected String doInBackground(String... params)
  • 参见developer.android.com/reference/android/os/AsyncTask.html 上的示例。记住最重要的特性... doInBackground() 在单独的线程上运行,并且不能更新 UI,因为只有主线程可以这样做。您从 doInBackground() 返回的内容(即下载的结果)将传递给 onPostExecute(),它在 UI 线程上运行,您可以从中安全地更新 UI。
  • 注意:doInBackground 的返回和参数类型都是模板化的,因为您可能希望后台函数使用和返回整数、Foos、MyDownloadDataType[] 或任何最适合工作的类型需要完成。
  • 感谢您的帮助,我发布了我的代码。我的应用程序没有崩溃,但我想传递包含在我的布局中的参数,但我无法在 AsynRask 线程中访问它。我该怎么办?
  • 我通过像这样声明我的参数来修复它: new UpdateValeur().execute(surnom);等我可以使用 param[0] 访问它...这是好方法吗?
【解决方案2】:

您的代码抛出 Android 无响应 (ANR) 异常,因为您在 UI 线程上发出 HTTP 请求。您必须确保 UI 线程始终响应用户。当您的服务器连接时不会发生这种情况,因为响应速度足够快,但是在超时或其他问题上,您每次都会得到这个。

答案是使用 AsyncTask 之类的东西在不同的线程上发出 HTTP 请求。

【讨论】:

  • 谢谢!我会尝试了解如何使用 AsyncTask。
【解决方案3】:

快速猜测:在 finally 块中的 try/catch 中,您只捕获了 IOException。也许在bufferedReader 上调用.close() 会引发不同的异常?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多