2017-06-05 93 views
0

我閱讀了很多指南,但我仍然感到困惑。應該通過AsyncTask類調用DialogFragment嗎?

某處,我讀了「活動流」不應該由一個DialogFragment被打斷,所以你應該叫DialogFragment一個的AsyncTask類活動課內。

在其他指南中,我看到DialogFragment正在從Activity類調用而不使用AsyncTask。

所以我的問題是:應該只通過AsyncTask類調用DialogFragment?

這是我到目前爲止的方式; Activity類代碼:

public class LunchActivity extends AppCompatActivity { 
....  
    public void callDialog(){ 
    class ShowInfoToUser extends AsyncTask<Bundle, Void, Bundle> {     
     ... 
     @Override 
     protected Bundle doInBackground(Bundle... args) { 
      ... 
     }  

     @Override 
     protected void onPostExecute(Bundle resultBundle) { 
      DialogFragment permissionDialogManager= permissionDialogManager.newInstance(messageBundle); 
      permissionDialogManager.show(activity.getSupportFragmentManager(), "Permission Dialog"); 
     }  
    }  
} 

這是一個擴展DialogFragment類:

public class PermissionDialogManager extends DialogFragment { 

    public static PermissionDialogManager newInstance(Bundle bundle) { 
     PermissionDialogManager frag = new PermissionDialogManager(); 
     frag.setArguments(bundle); 
     return frag; 
    }  

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     ... 
    } 
} 

謝謝

回答

1

AsyncTask的onPostExecute方法內的代碼在UI線程中執行。在你提供的例子中,如果你使用AsynTask或者不使用AsynTask,因爲代碼將在UI線程中執行。

也許在您看到的示例中,他們處理AsyncTask的doInBackground方法(在單獨的線程中執行)中的一些信息,然後在onPostExecute方法中使用先前的信息來調用DialogFragment。

如何知道你應該在UI線程中運行代碼?

Processes and Threads

當你的應用進行響應用戶交互密集的工作,這個單一線程模型可以產生,除非你正確地實現應用程序的性能較差。具體來說,如果在UI線程中發生了一切,執行諸如網絡訪問或數據庫查詢之類的長操作將會阻塞整個UI。當線程被阻塞時,不會分派任何事件,包括繪圖事件。從用戶的角度來看,應用程序似乎掛起。更糟糕的是,如果UI線程被阻塞超過幾秒(目前約5秒),用戶將看到臭名昭着的「應用程序無響應」(ANR)對話框。如果用戶不滿意,用戶可能會決定退出應用程序並將其卸載。

0

由於對話框將中斷用戶,我認爲沒有理由把它放在一個的AsyncTask。該對話不應該花費大量的時間來生成它自己。

相關問題