应该通过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线程中运行代码?
当你的应用进行响应用户交互密集的工作,这个单一线程模型可以产生,除非你正确地实现应用程序的性能较差。具体来说,如果在UI线程中发生了一切,执行诸如网络访问或数据库查询之类的长操作将会阻塞整个UI。当线程被阻塞时,不会分派任何事件,包括绘图事件。从用户的角度来看,应用程序似乎挂起。更糟糕的是,如果UI线程被阻塞超过几秒(目前约5秒),用户将看到臭名昭着的“应用程序无响应”(ANR)对话框。如果用户不满意,用户可能会决定退出应用程序并将其卸载。
由于对话框将中断用户,我认为没有理由把它放在一个的AsyncTask。该对话不应该花费大量的时间来生成它自己。