Android 将AsyncTasks用作单独的公共类
这个问题是我最初所问问题的延续 我正试图找到一种更好的方法,将ArrayList从AsyncTask传递给调用AsyncTask的任何活动,因此在我的情况下,我有一个扩展到AsyncTask的SongsManager.java,如下所示 我的问题是,它没有返回我的歌曲列表,我得到的大小为0。。。你知道我遗漏了什么,或者我需要进一步调整或添加代码吗 SongsManager.javaAndroid 将AsyncTasks用作单独的公共类,android,android-asynctask,Android,Android Asynctask,这个问题是我最初所问问题的延续 我正试图找到一种更好的方法,将ArrayList从AsyncTask传递给调用AsyncTask的任何活动,因此在我的情况下,我有一个扩展到AsyncTask的SongsManager.java,如下所示 我的问题是,它没有返回我的歌曲列表,我得到的大小为0。。。你知道我遗漏了什么,或者我需要进一步调整或添加代码吗 SongsManager.java public class SongsManager extends AsyncTask<Void, Voi
public class SongsManager extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
public interface SongsMasterCallback {
void showSongList(List<HashMap<String, String>> result);
}
private SongsMasterCallback mCallback;
public SongsManager (SongsMasterCallback callback)
{
mCallback = callback;
}
// Constructor
//public SongsManager(){ }
ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params)
{
//populating all the data....
HashMap<String, String> map = new HashMap<String, String>();
//.........
songsList.add(map);
}
return songsList;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
mCallback.showSongList(result);
}
}
main.java
public class Main extends Activity implements SongsMasterCallback {
public void showSongList(List<HashMap<String, String>> result)
{
this.songsList = (ArrayList<HashMap<String, String>>) result;
// then do something with the list here
}
@Override
public void onCreate(Bundle savedInstanceState) {
new SongsManager(this).execute();
Log.d("songsSize", "string : "+songsList.size()); //it shows 0 ???
}
}
试试这个
public class SongsManager extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
public interface SongsMasterCallback {
void showSongList(List<HashMap<String, String>> result);
}
private SongsMasterCallback mCallback;
public SongsManager (SongsMasterCallback callback)
{
mCallback = callback;
}
// Constructor
//public SongsManager(){ }
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params)
{
ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
//populating all the data....
HashMap<String, String> map = new HashMap<String, String>();
//.........
return map;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
songsList.add(result);
mCallback.showSongList(result);
}
这是因为您正在UI线程中创建songsList对象并在后台线程中添加数据。如果您将songsList的引用传递给AsynTask
public class SongsManager extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
private ArrayList<HashMap<String, String>> songsList;
public SongsManager (ArrayList<HashMap<String, String>> songsList)
{
this.songsList = songsList;
}
@Override
protected ArrayList<HashMap<String, String>> doInBackground(Void... params)
{
//populating all the data....
HashMap<String, String> map = new HashMap<String, String>();
//.........
songsList.add(map);
}
return songsList;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
// TODO Auto-generated method stub
//super.onPostExecute(result);
}
}
在main.java调用中
新歌曲管理器songslist.execute 从DoinBackground返回songsList时,列表中是否有值?如何从main.java类调用?您的意思是说onPostExecute中的结果大小为0。对吗?我还没有试过你的代码,让我试一下,我会给你回复的。在main.java文件中,我添加了这行代码来执行新的SongsManagerthis.execute;我仍然得到大小0让我们使用您显示的模式更新我的代码,但我仍然得到大小songsList 0当我运行代码时,它首先进入>>SongManager.java公共SongsManager ArrayList songsList然后songsList大小为0,然后进入main.java和new SongsManager songsList.execute;然后转到SongManager'doInBackground',在那里我看到songsList size=5,这是正确的,当它返回到main.java文件时,它的大小可能是0,如果您创建一个静态引用。。。创建一个抽象类并声明有公共静态ArrayList songsList;然后使用Class.songsList引用此对象。。。别忘了初始化。向asyncTask传递参数时不需要使用这种方式。