gpt4 book ai didi

java - 为什么我无法以这种风格在 AsyncTask 上添加元素

转载 作者:行者123 更新时间:2023-12-01 10:59:13 24 4
gpt4 key购买 nike

我是 Android 新手,在 Android 中遇到了此问题。基本上我想要一个 ListView 并为其实现一个自定义列表适配器。对于该适配器,我需要使用一个列表对其进行初始化,其中包含从某些网站获取的数据。我决定使用 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中没有数据。具体来说,当我尝试使用 Debug模式时,程序明显运行到“添加元素”部分,但由于某种原因清除了它。我怀疑我的代码逻辑是否错误,但找不到原因。经过一番盲目尝试后,我决定将“新的 ArrayList 部分移到 AsyncTask 之外”,如您所见,目前我的代码如下所示:

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();
}

现在可以了!我想问的问题是为什么会出现这种情况?我什至不知道发生了什么。与在另一个线程中分配内存有关吗?

抱歉我的愚蠢,但非常感谢您的帮助。

非常感谢。

最佳答案

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

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();
}
}

关于java - 为什么我无法以这种风格在 AsyncTask 上添加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33454838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com