我读了许多指南,但我仍然感到困惑。
在某处我读到“活动流”不应该被 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");
}
}
}
谢谢
答案 0 :(得分:1)
AsyncTask的onPostExecute方法中的代码在UI Thread中执行。在您提供的示例中,如果您使用AsynTask,则没有区别,因为代码将在UI线程中执行。
也许在你看过的例子中,他们在AsyncTask的doInBackground方法中处理一些信息(在单独的线程中执行),然后在onPostExecute方法中,他们使用前面的信息来调用DialogFragment。
如何知道何时在UI线程中运行代码?
当您的应用执行密集型工作以响应用户交互时,除非您正确实施应用程序,否则此单线程模型可能会产生较差的性能。具体来说,如果UI线程中发生了所有事情,则执行网络访问或数据库查询等长时间操作将阻止整个UI。线程被阻止时,不会调度任何事件,包括绘制事件。从用户的角度来看,应用程序似乎挂起。更糟糕的是,如果UI线程被阻止超过几秒钟(当前大约5秒),则向用户呈现臭名昭着的“应用程序无响应”(ANR)对话框。然后,用户可能会决定退出您的应用程序,如果他们不满意,请将其卸载。
答案 1 :(得分:0)
由于Dialog会中断用户,我认为没有理由把它放在AsyncTask中。该对话框不应该花费大量时间来生成自己。