Android 在DialogFragment中的何处以慢速方式实现异步任务以加载自定义ArrayAdapter?

Android 在DialogFragment中的何处以慢速方式实现异步任务以加载自定义ArrayAdapter?,android,listview,asynchronous,Android,Listview,Asynchronous,我有一个对话框片段,其中包含一个带有ListView的布局。我在自定义的DialogFragment.onCreateDialog()中使用警报生成器。在将对话框返回到调用片段之前,我创建了我的适配器并将listView的适配器设置为它。这是非常缓慢的,我的自定义适配器有很多工作要做。在添加默认适配器后,我尝试使用异步任务来设置适配器,但它仍然滞后。我假设默认适配器将快速加载,然后当异步完成时,它将更新listView 自定义对话框片段onCreateDialog(): 就好像在向活动视图添加任

我有一个对话框片段,其中包含一个带有ListView的布局。我在自定义的
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)
    ...
    ...