应该通过AsyncTask类调用DialogFragment吗?

问题描述:

我阅读了很多指南,但我仍然感到困惑。应该通过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) { 
     ... 
    } 
} 

谢谢

AsyncTask的onPostExecute方法内的代码在UI线程中执行。在你提供的例子中,如果你使用AsynTask或者不使用AsynTask,因为代码将在UI线程中执行。

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

如何知道你应该在UI线程中运行代码?

Processes and Threads

当你的应用进行响应用户交互密集的工作,这个单一线程模型可以产生,除非你正确地实现应用程序的性能较差。具体来说,如果在UI线程中发生了一切,执行诸如网络访问或数据库查询之类的长操作将会阻塞整个UI。当线程被阻塞时,不会分派任何事件,包括绘图事件。从用户的角度来看,应用程序似乎挂起。更糟糕的是,如果UI线程被阻塞超过几秒(目前约5秒),用户将看到臭名昭着的“应用程序无响应”(ANR)对话框。如果用户不满意,用户可能会决定退出应用程序并将其卸载。

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