Android 在DialogFragment中的何处以慢速方式实现异步任务以加载自定义ArrayAdapter?
我有一个对话框片段,其中包含一个带有ListView的布局。我在自定义的Android 在DialogFragment中的何处以慢速方式实现异步任务以加载自定义ArrayAdapter?,android,listview,asynchronous,Android,Listview,Asynchronous,我有一个对话框片段,其中包含一个带有ListView的布局。我在自定义的DialogFragment.onCreateDialog()中使用警报生成器。在将对话框返回到调用片段之前,我创建了我的适配器并将listView的适配器设置为它。这是非常缓慢的,我的自定义适配器有很多工作要做。在添加默认适配器后,我尝试使用异步任务来设置适配器,但它仍然滞后。我假设默认适配器将快速加载,然后当异步完成时,它将更新listView 自定义对话框片段onCreateDialog(): 就好像在向活动视图添加任
DialogFragment.onCreateDialog()
中使用警报生成器。在将对话框返回到调用片段之前,我创建了我的适配器并将listView的适配器设置为它。这是非常缓慢的,我的自定义适配器有很多工作要做。在添加默认适配器后,我尝试使用异步任务来设置适配器,但它仍然滞后。我假设默认适配器将快速加载,然后当异步完成时,它将更新listView
自定义对话框片段onCreateDialog()
:
就好像在向活动视图添加任何内容时,它挂起了UI线程?我在哪里可以做这项工作?我认为问题不在于自定义适配器。看起来你在这里得到了关于主线程的数据
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
currentGoals = MhaCacheManager.getInstance().getUserGoals();
if(currentGoals!=null)
...
...
为什么我这么说:您使用的是相同的方法
currentGoals=MhaCacheManager.getInstance().getUserGoals()代码>也在异步任务中。看起来您在主线程中也使用了相同的方法。尝试从onCreateDialog
中删除上面提到的代码,它应该可以正常工作。你能把适配器代码也放进去吗?有太多的元素要显示吗?在哪里实现异步任务
-哪里都没有。不要使用AsyncTask
,因为它太容易击中自己的腿。具体地说,不要从主线程外部触摸listView
。关于性能问题-做评测,看看到底什么是“慢”。是的,我现在看到重复的方法,一定是在我尝试不同的解决方案时留下的。谢谢你的提醒。至于UI线程,它只需拉一个arrayList,其中不超过8个对象。假期过后,我会把它取下来看看:)
public class DialogLoaderAsync extends AsyncTask<Void, Void, Void>
{
private Context context;
private ProgressDialog mDialogProgress;
private ListView lView;
private GoalsArrayAdapter.OnDialogUpdated mParent;
ArrayAdapter<String> myAdapter;
public interface OnArrayAdapterLoaded
{
public void onArrayAdapterLoaded();
}
public OnArrayAdapterLoaded listener;
public DialogLoaderAsync(Context context, ListView lView,GoalsArrayAdapter.OnDialogUpdated mParent)
{
this.context=context;
this.lView=lView;
this.mParent=mParent;
}
@Override
protected Void doInBackground(Void... params)
{
ArrayList<MhaCacheManager.UserGoals> currentGoals = MhaCacheManager.getInstance().getUserGoals();
ArrayAdapter<String> myAdapter = new GoalsArrayAdapter(context, currentGoals, mParent);
lView.setAdapter(myAdapter); // Really time consuming.
return null;
}
@Override
public void onPostExecute(Void param)
{
lView.deferNotifyDataSetChanged();
}
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
currentGoals = MhaCacheManager.getInstance().getUserGoals();
if(currentGoals!=null)
...
...