应该通过AsyncTask类调用DialogFragment吗?

时间:2017-06-05 09:32:53

标签: java android android-activity android-dialogfragment

我读了许多指南,但我仍然感到困惑。

在某处我读到“活动流”不应该被 DialogFragment 中断,所以你应该在活动类中的 AsyncTask类内调用DialogFragment

在其他指南中,我看到在不使用AsyncTask的情况下从Activity类调用DialogFragment。

所以我的问题是:应该只通过AsyncTask类调用DialogFragment吗?

这是我到目前为止的方式; Activity类代码:

$scope.date = $filter('date')(Date.now(), 'yyyy-MM-dd');//new Date();

这是扩展DialogFragment的类:

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");
        }    
    }    
}

谢谢

2 个答案:

答案 0 :(得分:1)

AsyncTask的onPostExecute方法中的代码在UI Thread中执行。在您提供的示例中,如果您使用AsynTask,则没有区别,因为代码将在UI线程中执行。

也许在你看过的例子中,他们在AsyncTask的doInBackground方法中处理一些信息(在单独的线程中执行),然后在onPostExecute方法中,他们使用前面的信息来调用DialogFragment。

如何知道何时在UI线程中运行代码?

Processes and Threads

  

当您的应用执行密集型工作以响应用户交互时,除非您正确实施应用程序,否则此单线程模型可能会产生较差的性能。具体来说,如果UI线程中发生了所有事情,则执行网络访问或数据库查询等长时间操作将阻止整个UI。线程被阻止时,不会调度任何事件,包括绘制事件。从用户的角度来看,应用程序似乎挂起。更糟糕的是,如果UI线程被阻止超过几秒钟(当前大约5秒),则向用户呈现臭名昭着的“应用程序无响应”(ANR)对话框。然后,用户可能会决定退出您的应用程序,如果他们不满意,请将其卸载。

答案 1 :(得分:0)

由于Dialog会中断用户,我认为没有理由把它放在AsyncTask中。该对话框不应该花费大量时间来生成自己。