使用AsyncTasks作为单独的公开课 [英] Using AsyncTasks as separate public classes

查看:126
本文介绍了使用AsyncTasks作为单独的公开课的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个问题是什么,我都问orginally <延续href=\"http://stackoverflow.com/questions/9690055/type-mismatch-cannot-convert-from-asynctask\">here

我试图找到一种更好的方式来传递从的AsyncTask ArrayList中的活动(任何活动调用AsyncTask的),所以在我的情况,我有一个 SongsManager.java 延伸到的AsyncTask ,你可以看到下面。

我的问题是,它不返回我的0 songsList 我得到大小...任何想法我失踪或者我需要调整或增加任何code再?

SongsManager.java

 公共类SongsManager扩展的AsyncTask&LT;无效,无效的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT;&GT; {              公共接口SongsMasterCallback {
            无效showSongList(列表&LT;&HashMap的LT;字符串,字符串&GT;&GT;结果);
        }        私人SongsMasterCallback mCallback;
        公共SongsManager(SongsMasterCallback回调)
        {
            mCallback =回调;
        }        //构造
        //公共SongsManager(){}
        ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT; songsList =新的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT;();
        @覆盖
        保护的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT; doInBackground(虚空...... PARAMS)
              {
                 //填充所有数据....
           HashMap的&LT;字符串,字符串&GT;地图=新的HashMap&LT;字符串,字符串&GT;();
                 // .........
                 songsList.add(地图);
        }           返回songsList;
        }        @覆盖
        保护无效onPostExecute(ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT;的结果){
            // TODO自动生成方法存根
            //super.onPostExecute(result);
            mCallback.showSongList(结果);
        }
    }

main.java

 公共类主要活动扩展实现SongsMasterCallback {公共无效showSongList(列表&LT;&HashMap的LT;字符串,字符串&GT;&GT;结果)
{
     this.songsList =(ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT;)的结果;
     //然后做一些与此列表
}@覆盖
公共无效的onCreate(捆绑savedInstanceState){  新SongsManager(本).execute();
  Log.d(songsSize,字符串:+ songsList.size()); //它显示0?}}


解决方案

试试这个

 公共类SongsManager扩展的AsyncTask&LT;无效,无效的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT;&GT; {            公共接口SongsMasterCallback {
            无效showSongList(列表&LT;&HashMap的LT;字符串,字符串&GT;&GT;结果);
        }        私人SongsMasterCallback mCallback;
        公共SongsManager(SongsMasterCallback回调)
        {
            mCallback =回调;
        }        //构造
        //公共SongsManager(){}
        @覆盖
        保护的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT; doInBackground(虚空...... PARAMS)
              {
                 ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT; songsList =新的ArrayList&LT;&HashMap的LT;字符串,字符串&GT;&GT;();
                 //填充所有数据....
                 HashMap的&LT;字符串,字符串&GT;地图=新的HashMap&LT;字符串,字符串&GT;();
                 // .........                 返回地图;
               }        @覆盖
        保护无效onPostExecute(ArrayList的&LT;&HashMap的LT;字符串,字符串&GT;&GT;的结果){
            // TODO自动生成方法存根
            //super.onPostExecute(result);
            songsList.add(结果);
            mCallback.showSongList(结果);
        }

这是发生,因为你是在UI线程创建songsList的对象,并在后台线程中添加数据。

this question is a continuation of what i have asked orginally here

i am trying to find a better way to pass the ArrayList from AsyncTask to the Activity (any activity that calls the AsyncTask) so in my situation i have a SongsManager.java which extends to AsyncTask as you can see below.

my question is, It does not returning me the songsList i am getting size of 0... any idea what i am missing or do i need to tweak or add any code further?

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 ??? 

}

}

解决方案

Try this

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

This is happening because you are creating object of songsList in UI thread and adding data in background thread.

这篇关于使用AsyncTasks作为单独的公开课的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆