2014-11-03 105 views
0

我創建了這個方法來處理創建警報對話框的兩種不同方式,這取決於互聯網的狀態。你知道更好的方式來獲得相同的結果嗎?在if-else塊中的字符串上使用.equals()似乎不是最佳實踐方式......我是對的嗎?你知道更好的方法來寫這種方法嗎?

public void noInternetAlertDialog(String errorMsg) { 
    String title = null; 
    String msg = null; 

    if (errorMsg.equals("none")) { 
     title = "Connection failded"; 
     msg = "Please check internet connection"; 
    } else if (errorMsg.equals("slow")) { 
     title = "Connection timeout"; 
     msg = "Connection is slow"; 
    } 

    AlertDialog.Builder builder; 
    builder = new AlertDialog.Builder(Main.this); 
    builder.setCancelable(false); 
    builder.setTitle(title); 
    builder.setMessage(msg); 

    builder.setPositiveButton("Retry", new DialogInterface.OnClickListener(){ 
     @Override 
     public void onClick(DialogInterface dialog, int which) 
     { 
      dialog.dismiss(); 
      downloadDialog(); 
     } 
    }); 

    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
      finish(); 
     } 
    });   
    AlertDialog dialog = builder.create(); 
    dialog.show(); 
} 
+2

您可以避免2個if檢查之一。如果是'「none」',只要是**,**其他**(不是** else if **),則執行另一個塊。更好的是,你可以初始化字符串值,就像'else values'一樣,只有'none'時纔會改變它們。 – 2014-11-03 10:51:24

回答

1
  1. 使用strings.xml您的字符串讓本地化(重試,取消「連接failded」,「請檢查互聯網連接」,「連接超時「,」連接速度慢「)
  2. 如果您的值表示某些內容爲它們創建數據類型。我的意思是:如果你的字符串會報告,如果互聯網可用或緩慢,爲什麼保持它作爲字符串?一個字符串可以是一切,並轉換爲直接說明它可以承擔什麼樣的價值會提高你的代碼很多東西。

    public enum InternetStatus { 
        Offline, 
        Slow 
    } 
    

    而一個==會比equals調用更快。 如果你不想使用enum,可以考慮使用"none".equals(errorMessage)

    String title = "Connection failded"; 
    String msg = "Please check internet connection"; 
    
    if ("slow".equals(errorMsg)) { 
        title = "Connection timeout"; 
        msg = "Connection is slow"; 
    } 
    
  3. 你可以調用鏈的建設者和刪除變量dialog,因爲你可以直接調用show()(如果你還需要參考AlertDialog,show()仍然返回它)。

  4. 你可以跟你的幻想和做這樣的事情

    .setTitle(errorMsg == InternetStatus.Slow ? "Connection timeout" : "Please check internet connection") 
    .setMessage(errorMsg == InternetStatus.Slow ? "Connection failded" : "Connection is slow") 
    

    但它會使你的代碼一個爛攤子,如果你想添加更多InternetStatus。 你可以在InternetStatus裏面創建一個返回消息的方法(如果在其他地方也需要的話)。但它高度取決於您正在使用的項目。你可以使用一種「擴展」方法,它可以在你需要的地方爲你做,而不用把它放在enum的代碼中(enum可以有方法)。你應該考慮每一個機會。


也許?

public enum InternetStatus { 
    Offline, 
    Slow 
} 

public void noInternetAlertDialog(InternetStatus errorMsg) { 
    String title = getString(R.string.internetfailed); 
    String msg = getString(R.string.checkyourinternet); 

    if (errorMsg == InternetStatus.Slow) { 
    title = getString(R.string.connectiontimeout); 
    msg = getString(R.string.slowinternet); 
    } 

    new AlertDialog.Builder(Main.this) 
     .setCancelable(false) 
     .setTitle(title) 
     .setMessage(msg) 
     .setPositiveButton(R.string.retry, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
      downloadDialog(); 
     } 
     }) 
     .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
      finish(); 
     } 
     }) 
     .show(); 
} 
+0

離線值未使用? – smartmouse 2014-12-15 15:55:37

+0

當您調用方法時會使用它 – 2014-12-15 16:05:53

+0

對不起,我很害怕我不明白。你能解釋什麼時候「離線」值被調用? – smartmouse 2014-12-15 16:37:11

1

用字符串標識狀態/結果確實不是一個好主意!你應該使用枚舉。

enum NoInternetResult { 
    slow, none 
} 

然後:

public void noInternetAlertDialog(NoInternetResult result) { 
String title = "Connection failded"; 
String msg = "Please check internet connection"; 

if (result==NoInternetResult.slow) { 
    title = "Connection timeout"; 
    msg = "Connection is slow"; 
} 

BTW。使用的strings.xml爲你喜歡的字符串「重試」和「取消」(http://developer.android.com/guide/topics/resources/string-resource.html

+0

是「none」值未使用? – smartmouse 2014-12-15 16:00:50

+0

其實你不需要這裏!因爲這個實現中的「none」是默認的!只有當結果是「緩慢」時,默認值纔會被覆蓋 – Michael 2014-12-15 18:17:18

+0

對不起,但它似乎沒有意義。如果我從枚舉NoInternetResult中刪除「none」,怎麼辦?無論如何它不工作? – smartmouse 2014-12-20 15:27:03

相關問題