2011-03-14 59 views
1

我開發了一個android 2.1應用程序,它使用SOAP Web服務。 當我的應用程序開始使用時,它首先檢查是否有互聯網連接。重新啓動應用程序再次從主要和清除活動堆棧

如果是這樣,它將顯示相應的活動。 如果沒有,那麼它將顯示一個活動(NetworkErrorActivity),提供關於網絡錯誤和所有信息。

問題是如果沒有互聯網連接,它會向我顯示NetworkErrorActivity。 現在,當用戶按下後退按鈕時,它將用戶重定向到Home。 我已經重寫onBackPressed方法是這樣的:

@覆蓋 公共無效onBackPressed(){

 Intent setIntent = new Intent(Intent.ACTION_MAIN); 
     setIntent.addCategory(Intent.CATEGORY_HOME); 
     setIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(setIntent); 
     return; 
    } 

按後退按鈕後,它讓我看到的是Android主屏幕。 但問題是,當我再次啓動相同的應用程序時,即使有網絡連接,它也會向我顯示NetworkErrorActivity。無法從主啓動器活動啓動應用程序。它總是向我展示同一活動一次又一次。

+0

顯示在您檢查網絡並啓動該活動的代碼 – ingsaurabh

+0

看到這個: 嘗試{\t \t androidHttpTransport =新HttpTransportSE(URL,30000); \t \t androidHttpTransport.call(SOAP_ACTION,envelope); \t \t so =(SoapObject)envelope.bodyIn; \t \t String st = so.toString(); //做一些處理..... } 趕上(例外五) \t \t { \t \t Log.i( 「沒有互聯網」,e.getMessage()); \t \t this.cancel(true); \t \t Intent intent = new Intent(context,NetworkErrorActivity.class); \t \t startActivity(intent); \t \t \t \t} –

+0

是每一個日誌打印的時間,如果是,那麼有一些例外,這並不是網絡,而是使捕撈代碼每次運行時使調試代碼的任何異常 – ingsaurabh

回答

1

我使用AlertDialog(不是活動)通知用戶需要網絡連接並帶有一個選項,以將其連接到網絡設置(啓用移動/ wi-fi)連接。如果他們選擇單擊「取消」,而是強制完成主要活動()。

檢查主活動onResume()中的網絡連接,並且如果沒有連接,則調用CreateNetErrorDialog()...不可能使用BACK來關閉對話框 - 僅取消殺死主要活動的對話框。

例...

protected void CreateNetErrorDialog(String errorMessage) { 
    Log.d(TAG, "CreateNetErrorDialog() entered..."); 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage(errorMessage) 
    .setTitle("Unable to connect") 
    .setCancelable(false) 
    .setPositiveButton("Settings", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Intent i = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 
       startActivity(i); 
      } 
     } 
    ) 
    .setNegativeButton("Cancel", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       MyMainActivity.this.finish(); 
      } 
     } 
    ); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
    Log.d(TAG, "Exiting CreateNetErrorDialog()..."); 
} 

編輯:調用CreateNetErrorDialog從您的AsyncTask的onPostExecute()方法 - 它運行在UI線程(doInBackground沒有)。從我自己的代碼示例...

private class FileDownloader extends AsyncTask<String, Void, Void> { 
    private Boolean Success = false; 
    private String ResultString = ""; 

    @Override 
    protected Void doInBackground(String... params) { 
     try { 
      // Do whatever 
     } 
     catch (Exception e) { // <-- Use the correct exception type 
       ResultString = "Some error message"; 
     } 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (!Success) 
      CreateNetErrorDialog (ResultString); 
     else 
      // Do whatever 
    } 
} 
+0

我想要做的是,當沒有互聯網連接,我想顯示的東西告訴用戶,你沒有互聯網連接或網絡錯誤...然後要強制應用程序關機 你可以建議我什麼將是最好的做這件事? –

+1

@Kartik:我試圖展示的不是啓動一個Activity來告訴用戶存在網絡問題,而是嘗試一個AlertDialog,就像我在代碼中顯示的那樣(將消息更改爲任何你需要的內容)。如果需要,「設置」按鈕可讓他們選擇轉到Android設置以啓用Wi-Fi /移動互聯網 - 當他們從設置返回時,如果連接再次失敗,請再次顯示對話框。如果他們在AlertDialog上使用Cancel,它將在您的主要活動中調用finish(),並且不可能使用BACK退出AlertDialog,因此可以解決您的問題。 – Squonk

+0

@ MisterSquonk:你是絕對正確的。看看我在做什麼,當我的應用程序啓動時,它會檢查互聯網連接。我已經使用AsynTask進行後臺處理。我正在使用網絡超時參數? (我不知道它是否好)。如果發生網絡超時,則會引發InterruptedException。在catch塊中,我正在調用alertdialog。但它沒有向我展示對話。 –

0

我完全不知道你想要什麼,但在catch block嘗試這樣的事情,而不是做一個連接,並編寫代碼的這是不是一個好的做法

到檢查網絡使用以下代碼

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo ni = cm.getActiveNetworkInfo(); 

然後根據不同的上述代碼結果

if (ni == null) 
{ 
     //Show you network error activity 
} 
else 
{ 
    //Show some other activity 
} 
+0

我也試過這個。但它總是讓我聯繫起來。 :( 我認爲問題是:我連接到局域網但沒有登錄因特網使用在防火牆。我需要改變我的IP我想或使用個人電腦?? –

+0

可能會嘗試在真實設備上.. – ingsaurabh

+0

Yaa是正確的,讓我試試這個。請檢查它並發表評論。 –

相關問題