【问题标题】:Using AsyncTasks as separate public classes使用 AsyncTasks 作为单独的公共类
【发布时间】:2012-03-14 13:24:56
【问题描述】:

这个问题是我最初提出的问题的延续here

我正在尝试找到一种更好的方法将 ArrayList 从 AsyncTask 传递到 Activity(任何调用 AsyncTask 的活动),所以在我的情况下,我有一个 SongsManager.java,它像你一样扩展到 AsyncTask可以看下面。

我的问题是,它没有返回 songsList 我的大小为 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 ??? 

}

}

【问题讨论】:

  • 在从doInbackgroung返回songsList的时候,List中有值吗

标签: android android-asynctask


【解决方案1】:

如果你将歌曲列表的引用传递给 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 中调用 new SongsManager(songsList).execute();

【讨论】:

  • 我已经用你展示的模式更新了我的代码,但我仍然得到了 songList 0 的大小
  • 当我运行我的代码时,它首先转到 >>SongManager.java (public SongsManager (ArrayList&lt;HashMap&lt;String, String&gt;&gt; songsList) 然后这里的歌曲列表大小为 0 然后转到 main.java 和 new SongsManager(songsList).execute(); 然后转到那里的 SongManager 'doInBackground`我看到 songList 大小 = 5(这是正确的),当它返回到 main.java 文件时,它的大小为 0
  • 也许如果你创建一个静态引用...创建一个抽象类并在那里声明“public static ArrayList> songList;”然后用 Class.songsList 引用这个对象...不要忘记初始化。这种方式不需要将参数传递给 asyncTask。
【解决方案2】:

试试这个

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 线程中创建歌曲列表对象并在后台线程中添加数据。

【讨论】:

  • 如何从 main.java 类调用?
  • 你的意思是 onPostExecute 的结果是大小为 0。对吗?
  • 我还没试过你的代码,让我试试,我会回复你的。
  • 在 main.java 文件中我添加了这行代码来执行new SongsManager(this).execute();,我仍然得到大小 0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 2014-07-08
  • 2013-10-22
  • 1970-01-01
  • 2020-02-26
  • 2018-05-14
  • 1970-01-01
相关资源
最近更新 更多