如何防止android应用程序因后台线程中的IOException而崩溃?

如何防止android应用程序因后台线程中的IOException而崩溃?,android,multithreading,Android,Multithreading,我想知道是否有一种方法可以防止试图在传递的uri字符串上建立连接的后台线程由于IOException或MalformedURLException而导致整个应用程序崩溃。 当我捕获抛出的所有异常并将消息打印到logcat时,我不希望应用程序与消息一起崩溃:不幸的是,MyApp已经停止了。 我希望通过在主/UI线程上发布相关的错误消息,让应用程序优雅地退出 比如说: public void onClick(View v){ new Thread(new MyDownloaderClass(u

我想知道是否有一种方法可以防止试图在传递的uri字符串上建立连接的后台线程由于
IOException
MalformedURLException
而导致整个应用程序崩溃。 当我捕获抛出的所有异常并将消息打印到logcat时,我不希望应用程序与消息一起崩溃:
不幸的是,MyApp已经停止了
。 我希望通过在主/UI线程上发布相关的错误消息,让应用程序优雅地退出

比如说:

public void onClick(View v){
    new Thread(new MyDownloaderClass(url_str)).start();
}

private class MyDownloaderClass implements Runnable{
    private String url_str;
    public MyDownloaderClass(String arg){url_str=arg;}
    public void run(){
        URL url=null;
    int respCode=0;
    try{
        url=new URL(str);
        HttpURLConnection connection=(HttpURLConnection)url.openConnection();
        connection.setRequestMethod("HEAD");
        connection.connect();
        respCode=connection.getResponseCode();

    }catch(MalformedURLException e){
        Log.e(TAG,e.getClass()+": "+e.getMessage());

    }catch(IOException e){
        Log.e(TAG,e.getClass()+": "+e.getMessage());

    }
}
}
在这种情况下,如果输入的字符串不是可使用的url或无法建立连接,我的应用程序就会崩溃。但我希望能够在UI线程上发布一些有用的消息,防止应用程序崩溃


多谢各位

然后把它放在锁扣部分

catch (Exception e) {
     if(e.getMessage().toString().equalsIgnoreCase("write your exception from logcat"))
        {
         //show your error in a toast or a dialog
         Toast.makeText(this," your pertinent error message ", Toast.LENGTH_LONG);
                }
            }

我建议您在AsyncTask中执行所有网络操作

在AsyncTask方法的doinBackground()中,使用try/catch执行所有网络操作。如下所示处理异常

//Define "Exception error = null;" in your AsyncTask class.
catch(Exception ex) {
    Log.e(TAG,e.getClass()+": "+ex.getMessage());
    error = ex;
}
在onPostExecute()方法中检查

if (error ! = null) {
    //Toast msg . // You should not call a Toast msg in your doinBackground method.
}

您错误地使用了Thread.start()而不是Thread.run():


您的代码仍然在原始线程上运行,因此会出现导致崩溃的异常。

Logcat中的错误跟踪中显示了什么?因此,如果用户输入了一些乱七八糟的url并单击按钮,那么我会得到09-28 15:05:29.262:E/MyApp Activity(2940):class java.net.MalformedURLException:Protocol not found:然后应用程序崩溃。我想用一种方式来处理这个问题,即要求用户通过在主线程上发布消息来检查输入的url。因为它是一个后台线程,所以我使用runOnUiThread方法在主线程上创建一个toast来通知用户错误的输入。但是应用程序只是在捕捉到异常时崩溃,并且没有在UIhi pushkar上创建toast,谢谢您的回复。我想知道如何在不使用异步任务的情况下完成它。
          new Thread(new MyDownloaderClass(url_str)).start();