2013-09-28 83 views
1

我想知道是否有一種方法可以防止由於IOExceptionMalformedURLException而導致試圖在傳遞的uri字符串上建立連接的後臺線程崩潰整個應用程序。 雖然我捕獲了所有拋出的異常並將消息輸出到logcat,但我不希望應用程序與msg:Unfortunately, MyApp has stopped一起崩潰。 我希望應用程序通過在主/ UI線程上發佈相關的錯誤消息來優雅地退出。如何防止Android應用程序因後臺線程中的IOException而崩潰?

說,例如:

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()); 

    } 
} 
} 

在這種情況下,我的應用程序崩潰,只是如果輸入的字符串不是prasable網址或無法建立連接進行。但我希望能夠在UI線程上發佈一些有用的消息,並防止應用程序崩潰。

謝謝。

+0

Logcat中的錯誤跟蹤中顯示了什麼? – NormR

+0

因此,如果用戶輸入一些亂碼url並點擊按鈕,那麼我得到09-28 15:05:29.262:E/MyApp Activity(2940):class java.net.MalformedURLException:Protocol not found:然後應用程序崩潰。我想通過在主線程中發佈消息來要求用戶檢查輸入的URL的方式來處理此問題。 – kharesp

回答

1

然後把它在catch部分

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); 
       } 
      } 
+0

嗨manishika,我厭倦了這一點。由於它的後臺線程,我使用runOnUiThread方法在主線程上創建一個toast來通知用戶輸入錯誤。但該應用程序只是在捕獲異常時崩潰,並不會在UI – kharesp

1

我會建議你做所有的網絡運營中的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(
+0

hi pushkar上創建敬酒,感謝回覆。我想知道如何在不使用異步任務的情況下完成此任務。 – kharesp

1

方法檢查),而不是Thread.run():

  new Thread(new MyDownloaderClass(url_str)).start(); 

你的代碼仍然運行在原始線程上,因此導致崩潰的異常。

相關問題