2012-08-13 36 views
0

我在Android的非常新,我有一個問題,請大家看看下面的代碼:爲什麼下一條指令立即執行?

new AlertDialog.Builder(this) 
    .setTitle("Save File") 
    .setMessage("Do you want to save to a file ?") 
    .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      // Ask user for a file name to save the text in the text editor. 
      PreSaveFile(); 

      // Clear text editor. 
      // This is executed immediately and it does not wait until PreSaveFile() ends. 
      CleanEditor(et); 
     } 
    }) 
.setNegativeButton("No", new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int whichButton) { 
     CleanEditor(et); 
    } 
}) 

的問題是,第二個電話,CleanEditor(et),不等到PreSaveFile()結束,所以當我選擇一個文件名來保存我在文本編輯器中的內容,CleanEditor(et)刪除的文本編輯器,所以什麼都不能保存。

我希望我已經夠清楚了。

+3

PreSaveFile()是做什麼的?你可以發佈代碼,以及你如何知道它沒有等待函數完成? – ChrisHarris2012 2012-08-13 18:48:24

+0

Private void PreSaveFile(){ \t EditText et =(EditText)findViewById(R.id.editText1);如果(et.length()== 0){ \t \t Toast.makeText(getBaseContext(),「Editor is empty!」,Toast.LENGTH_SHORT).show(); \t} \t \t如果(textFile.length()== 0){ \t \t意圖I =新意圖(MainActivity.this,FileChooser.class); \t \t \t \t Bundle myData = new Bundle(); \t \t \t myData.putString(「textFile」,「」); \t \t \t i.putExtras(myData); \t \t \t startActivityForResult(i,1); \t} else {SaveFile(); } \t} 顯示文件瀏覽器,以便您可以選擇一個文件來編寫文本編輯器的內容 – 2012-08-13 21:25:05

回答

0

首先,我將發表您的PreSaveFile()函數,以便它更易讀一點:

private void PreSaveFile() { 
    EditText et = (EditText)findViewById(R.id.editText1); 
    if (et.length() == 0) { 
     Toast.makeText(getBaseContext(), "Editor is empty!", Toast.LENGTH_SHORT).show(); 
    } 
    if (textFile.length() == 0) { 
     Intent i = new Intent(MainActivity.this, FileChooser.class); 
     Bundle myData = new Bundle(); 
     myData.putString("textFile", ""); 
     i.putExtras(myData); 
     startActivityForResult(i, 1); 
    } else { 
     SaveFile(); 
    } 
} 

我想提出兩點在這裏:

1)你有沒有檢查確保你的代碼遵循你假設它的執行路徑?特別是,你是否檢查過testFile.length()確實是0,以便代碼進入if()而不是else()?

2)更重要,startActivityForResult啓動活性在應答指示給this question執行異步。你想執行的任何代碼之後的結果已經被獲得,應該放在onActivityResult()的回調裏面,請參考this question的回答。

希望這會有所幫助!

3

如果PreSaveFile顯示一個輸入文件名的對話框,它不會等待對話框關閉並繼續執行,因此PreSaveFile完成並執行CleanEditor。

您必須添加一個偵聽器到創建的PreSaveFile()對話框中,並在您調用CleanEditor(et)的偵聽器中;

+0

因此,這是java的作品,它不同步? 它打破了程序的邏輯,因爲直到功能A完成後才能調用功能B. 我不能創建一個監聽器,並在其內部調用CleanEditor,因爲不必總是調用CleanEditor。 – 2012-08-13 21:28:10

+0

如果不能總是調用CleanEditor,那麼爲什麼它是PreSaveFile()之後的下一個函數調用?這意味着它將始終在PreSaveFile()終止後調用 – ChrisHarris2012 2012-08-14 13:27:18