为什么我不能以这种风格在AsyncTask上添加元素

时间:2015-10-31 18:05:02

标签: java android android-asynctask

我是Android新手,在Android中遇到过这个问题。基本上我想要一个列表视图并为它实现一个自定义列表适配器。对于该适配器,我需要使用列表初始化它,该列表包含从某个网站获取的数据。我决定使用AsyncTask。

我的原始代码如下:

public void onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ..........Other codes.........

    initData();
    mAdapter = new MainContentListAdapter(mList);

    ....................
}

public class FetchQTask extends AsyncTask<String, Void, ArrayList<MainContentListItem>> {

    ...... Some other codes ......

    @Override
    protected void onPostExecute(ArrayList<MainContentListItem> results) {
        if(mList!=null) mList.clear();
        else mList = new ArrayList<MainContentListItem>();
        for(MainContentListItem result : results) {
            mList.add(result);
        }
        progressDialog.cancel();
    }
}

 private void initData(){
    FetchQTask qTask = new FetchQTask();
    qTask.execute();
}

但是,当App启动时,mList中没有数据。具体来说,当我尝试使用调试模式时,程序显然会遇到&#34;添加元素&#34;部分但由于某种原因清楚它。我怀疑我的代码的逻辑是否不正确但无法找到原因。在一些盲目尝试之后,我决定在AsyncTask&#34;之外移动&#34;新的ArrayList部分,如你所见,目前我的代码如下:

public void onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ..........Other codes.........

    mList = new ArrayList<>();
    initData();
    mAdapter = new MainContentListAdapter(mList);

    ....................
}

public class FetchQTask extends AsyncTask<String, Void, ArrayList<MainContentListItem>> {

    ...... Some other codes ......

    @Override
    protected void onPostExecute(ArrayList<MainContentListItem> results) {
        if (results != null) {
            mList.clear();
            for(MainContentListItem result : results) {
                mList.add(result);
            }
        }
        progressDialog.cancel();
    }
}

 private void initData(){
    FetchQTask qTask = new FetchQTask();
    qTask.execute();
}

现在它有效!我想问的问题是为什么会这样?我甚至不知道发生了什么。是否与在另一个线程中分配内存有关?

对不起我的愚蠢,但非常感谢任何帮助。

非常感谢。

1 个答案:

答案 0 :(得分:1)

这是因为在使用此数组实现适配器后,必须维护“mList”数组的相同实例。 在第一种情况下,清除mList并在onPostExecute方法中重新设置它,因此您在适配器中设置的Array实例与新实例不同:

public void onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    ..........Other codes.........

    --> mList = new ArrayList<MainContentListItem>();
    initData();
    mAdapter = new MainContentListAdapter(mList);

    ....................
}

public class FetchQTask extends AsyncTask<String, Void, ArrayList<MainContentListItem>> {

    ...... Some other codes ......

    @Override
    protected void onPostExecute(ArrayList<MainContentListItem> results) {
        // Here your mList array is not null because already instanciate onCreateView method.
        for(MainContentListItem result : results) {
            mList.add(result);
        }
        progressDialog.cancel();
    }
}