2012-06-04 156 views
0

我的Android遊戲需要從我的服務器獲取有關玩家的一些信息。我通過一個簡單的HTTP GET請求來完成這個任務,我把它放在一個線程中。Android:當網絡連接不工作時,應用程序崩潰

我使用的代碼如下。當我的服務器啓動並運行時,應用程序工作正常。然而,當我的服務器沒有響應(或者因爲它忙或者不響),應用程序崩潰。

代替應用程序崩潰,我想向用戶顯示「網絡正忙」的消息,並將其發送回主要活動,但不知道該怎麼做。

我試圖在Catch部分內創建一個對話框,認爲這將顯示我的服務器是否關閉,但它沒有顯示並且應用程序崩潰。

任何想法我可以解決這個問題?

public void run(){  
     String urlstring = "http://www.mydomain.com/?param=test"; 
     try{       
       URL url = new URL(urlstring); 
       HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream())); 
       line = reader.readLine(); 
     } 
     catch(Exception e){ 
      Dialog d2 = new Dialog(context); 
      d2.setContentView(R.layout.dialog2); 
      d2.show(); 
     } 
} 

更新:我想我發現看logcat的問題。即使在服務器關閉的情況下,我的BufferedReader也返回了一個空字符串,並且我試圖在這條路上使用它。

+0

如果你想在UI線程上做些事情(即打開對話框,修改視圖等),你應該考慮使用一個'AsyncTask'來代替。哦,並從logcat發佈堆棧跟蹤。 – Jens

+0

如果我在「Catch」部分內沒有做任何事情,應用程序仍然崩潰,所以我不認爲它與我的對話框有關。 –

+0

那麼,無論是在線139是罪魁禍首。你是否在不檢查列表邊界的情況下從列表中獲取你應該從列表中下載的URL? – Jens

回答

2

所以起初,你應該檢查你的迴應。這是最好的辦法

if (urlConntection.getResponseCode() == HttpURLConnection.HTTP_OK) { 
    // method body 
} 
else { 
    /// get some info for example with Toast or Dialog 
} 

你應該決定使用runOnUiThread當你想從Non-UI thead

YourActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 

      } 
     }); 

更新UI或者使用HandlerAsyncTask

當您決定使用AsyncTask,你可以只顯示幾乎所有的東西

protected void onProgressUpdate(String... data) { 
    if(data[0].equals("error")) { 
    Toast.makeText(Activity.this, "Connection is busy!", Toast.LENGTH_SHORT).show(); 
} 

也只是顯示Dialog。隨你便。

相關問題