Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:如何在不强制关闭的情况下处理try catch中的错误_Android - Fatal编程技术网

Android:如何在不强制关闭的情况下处理try catch中的错误

Android:如何在不强制关闭的情况下处理try catch中的错误,android,Android,当我运行asynctask以连接到HTTP服务器时,我希望在它无法连接到服务器时显示错误消息。相反,应用程序会在出现错误时强制关闭,而不会显示错误消息。我想在发生错误时显示错误消息,而不是崩溃,但它只是在body description alert dialog中显示带有消息error(e.getMessage())的警报对话框 下面是我的代码: private String downloadUrl(String strUrl) throws IOException { String d

当我运行asynctask以连接到HTTP服务器时,我希望在它无法连接到服务器时显示错误消息。相反,应用程序会在出现错误时强制关闭,而不会显示错误消息。我想在发生错误时显示错误消息,而不是崩溃,但它只是在body description alert dialog中显示带有消息error(e.getMessage())的警报对话框

下面是我的代码:

private String downloadUrl(String strUrl) throws IOException {
    String data = "";
    InputStream iStream = null;
    try {
        URL url = new URL(strUrl);

        HttpURLConnection urlConnection = (HttpURLConnection) url
            .openConnection();

        urlConnection.connect();
        iStream = urlConnection.getInputStream();

        BufferedReader br = new BufferedReader(new InputStreamReader(
            iStream));

        StringBuffer sb = new StringBuffer();

        String line = "";
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        data = sb.toString();
        br.close();
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
        ErrorDialog(e.getMessage());
    }

    return data;
 }

private class DownloadTask extends AsyncTask<String, Integer, String> {
    String data = null;

    @Override
    protected String doInBackground(String... url) {
        try {
            data = downloadUrl(url[0]);
        } catch (IOException e) {
            Log.d(TAG, e.getMessage());
            ErrorDialog(e.getMessage());
        }

        return data;
    }

    @Override
    protected void onPostExecute(String result) {
        if (result != null && result.length() < 0) {
            ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
            listViewLoaderTask.execute(result);
        }
    }
}

private void ErrorDialog(String Description) {
    AlertDialog.Builder alertDialog = new AlertDialog.Builder(
            ListCategoryActivity.this);
    alertDialog.setTitle("You get Error...");
    alertDialog.setMessage(Description);
    alertDialog.setIcon(R.drawable.ic_warning);

    alertDialog.setNegativeButton("Cancel",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                }
            });

    alertDialog.show();
}
谢谢。

如日志所示:

RuntimeException:无法在尚未创建的线程内创建处理程序 调用Looper.prepare()

因为您试图从AsyncTask的doInBackground显示AlertDialog,而我们无法从doInBackground方法更新UI元素。将代码更改为在doInBackground中处理执行:

String strcatcherror="";
@Override
protected String doInBackground(String... url) {
    try {
        data = downloadUrl(url[0]);
        strcatcherror="";
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
        strcatcherror=e.getMessage();

    }

    return data;
}

@Override
protected void onPostExecute(String result) {
    if(!strcatcherror.equals("")){
         if (result != null && result.length() < 0) {
           ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
           listViewLoaderTask.execute(result);
         }
       }
     else{
             // show error message here
             ErrorDialog(strcatcherror);
        }
}
字符串strcatcherror=“”;
@凌驾
受保护的字符串doInBackground(字符串…url){
试一试{
数据=下载url(url[0]);
strcatcherror=“”;
}捕获(IOE异常){
Log.d(标记,例如getMessage());
strCachError=e.getMessage();
}
返回数据;
}
@凌驾
受保护的void onPostExecute(字符串结果){
如果(!strCachError.equals(“”){
if(result!=null&&result.length()<0){
ListViewLoaderTask ListViewLoaderTask=新建ListViewLoaderTask();
listViewLoaderTask.execute(结果);
}
}
否则{
//在此处显示错误消息
错误对话框(strcatcherror);
}
}
您不能在doInBackground()内调用警报对话

因此,另一种方法是将全局变量(如XYZ)放置在Asyc类中,并将e.getMessage()设置为catch块中的变量XYZ。检查该变量是否为空并执行ErrorDialog(XYZ);在onPostExecute()方法中


希望它能对您有所帮助。

将对话框与UI线程分开运行。只需尝试以下方法:

私有类下载任务扩展了异步任务{
字符串数据=null;
@凌驾
受保护的字符串doInBackground(字符串…url){
试一试{
数据=下载url(url[0]);
}捕获(IOE异常){
Log.d(标记,例如getMessage());
runOnUiThread(新的Runnable(){
公开募捐{
ErrorDialog(例如getMessage());
}
});
}
}
返回数据;
}
@凌驾
受保护的void onPostExecute(字符串结果){
if(result!=null&&result.length()<0){
ListViewLoaderTask ListViewLoaderTask=新建ListViewLoaderTask();
listViewLoaderTask.execute(结果);
}
}
}

您不能直接从doinbackground()显示警报对话框。您需要从runOnUIThread()调用它,或者从postExecute()调用它,或者向活动处理程序发送消息。

Urlconnection具有setTimeout方法。 使用SocketTimeOutException捕捉它(它将被抛出回调用方)。
举杯庆祝。

检查AndroidManifest.xml文件作为INTERNETHi的权限谢谢回复,仍然不起作用,我认为下载URL中的问题通过回答Grishu解决了;解决了这个问题,但在此之前,我移动字符串downloadUrl来尝试asyntask DownloadTask。我删除了方法字符串downloadurl。谢谢兄弟,我给了你真实的答案和一票。
01-23 11:58:36.909: D/HaichalLog(5776): failed to connect to 
  /192.168.103.121 (port 80): connect failed: ENETUNREACH (Network is unreachable)
String strcatcherror="";
@Override
protected String doInBackground(String... url) {
    try {
        data = downloadUrl(url[0]);
        strcatcherror="";
    } catch (IOException e) {
        Log.d(TAG, e.getMessage());
        strcatcherror=e.getMessage();

    }

    return data;
}

@Override
protected void onPostExecute(String result) {
    if(!strcatcherror.equals("")){
         if (result != null && result.length() < 0) {
           ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
           listViewLoaderTask.execute(result);
         }
       }
     else{
             // show error message here
             ErrorDialog(strcatcherror);
        }
}
 ErrorDialog(e.getMessage());
 private class DownloadTask extends AsyncTask<String, Integer, String> {
    String data = null;
    @Override
    protected String doInBackground(String... url) {
       try {
            data = downloadUrl(url[0]);
          } catch (IOException e) {
           Log.d(TAG, e.getMessage());
        runOnUiThread(new Runnable(){
          public void run() {
                 ErrorDialog(e.getMessage());
                }
     });
    }
}
        return data;
    }
    @Override
    protected void onPostExecute(String result) {
        if (result != null && result.length() < 0) {
            ListViewLoaderTask listViewLoaderTask = new ListViewLoaderTask();
            listViewLoaderTask.execute(result);
        }
    }
    }