Android 将AsyncTasks用作单独的公共类

Android 将AsyncTasks用作单独的公共类,android,android-asynctask,Android,Android Asynctask,这个问题是我最初所问问题的延续 我正试图找到一种更好的方法,将ArrayList从AsyncTask传递给调用AsyncTask的任何活动,因此在我的情况下,我有一个扩展到AsyncTask的SongsManager.java,如下所示 我的问题是,它没有返回我的歌曲列表,我得到的大小为0。。。你知道我遗漏了什么,或者我需要进一步调整或添加代码吗 SongsManager.java public class SongsManager extends AsyncTask<Void, Voi

这个问题是我最初所问问题的延续

我正试图找到一种更好的方法,将ArrayList从AsyncTask传递给调用AsyncTask的任何活动,因此在我的情况下,我有一个扩展到AsyncTask的SongsManager.java,如下所示

我的问题是,它没有返回我的歌曲列表,我得到的大小为0。。。你知道我遗漏了什么,或者我需要进一步调整或添加代码吗

SongsManager.java

 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传递参数时不需要使用这种方式。