类型不匹配:不能从AsyncTask的转换 [英] Type mismatch: cannot convert from AsyncTask

查看:147
本文介绍了类型不匹配:不能从AsyncTask的转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于@汤姆解决方案更新:

SongsManager.java

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

main.java

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

更新结束

我使用的AsyncTask及以下一类的工作是,当我尝试执行我所获得

误差是在设计时间,所以没有LogCat中

下面是类:

SongManager.java

 公共类SongsManager扩展的AsyncTask<无效,无效的ArrayList<&HashMap的LT;字符串,字符串>>> {
//构造
公共SongsManager(){}
@覆盖
    保护的ArrayList<&HashMap的LT;字符串,字符串>> doInBackground(虚空...... PARAMS){
        // TODO自动生成方法存根        ArrayList的<&HashMap的LT;字符串,字符串>> songsList =新的ArrayList<&HashMap的LT;字符串,字符串>>();        Xml_Parser_Custom_Listview分析器=新Xml_Parser_Custom_Listview();
        字符串XML = parser.getXmlFromUrl(URL); // URL从XML获得
        文档的文档= parser.getDomElement(XML); //获得DOM元素        节点列表NL = doc.getElementsByTagName(KEY_NAME);
        //遍历所有歌曲节点&LT循环;宋>
        的for(int i = 0; I< nl.getLength();我++){
            //创建新的HashMap
            HashMap的<字符串,字符串>地图=新的HashMap<字符串,字符串>();
            元素e =(元)nl.item(I)
            //将每个子节点的HashMap键=>值
            //添加入行到地图...            //添加HashList到ArrayList的
            songsList.add(地图);
        }        返回songsList;
    }
}

main.java文件

试图执行的AsyncTask的:

 公开的ArrayList<&HashMap的LT;字符串,字符串>> songsList =新的ArrayList<&HashMap的LT;字符串,字符串>>();
songsList =新SongsManager()执行();

这里是错误:

 类型不匹配:不能从AsyncTask的&LT转换;无效,无效的ArrayList<&HashMap的LT;字符串,字符串>>>到ArrayList的<&HashMap的LT;字符串,字符串>>


解决方案

返回的值SongsManager.execute()不是计算的结果;它的的AsyncTask 本身。要发布你的结果,写的方法 SongsManager

 无效onPostExecute(ArrayList的<&HashMap的LT;字符串,字符串>>的结果){
    songsList =结果; //或者类似的东西
    //然后更新UI以反映结果
}

在此方法中, songsList 是变量,你正试图从分配新SongsManager.execute()。如果这个变量不是在 SongsManager 类(比如,它不是一个嵌套类主类的)可见,那么你就必须为回拨安排:

 公共类SongsManager
    延伸AsyncTask的<太虚,太虚,列表与LT;地图<字符串,字符串>>
{
    公共接口SongsMasterCallback {
        无效showSongList(列表<地图<字符串,字符串>>结果);
    }    私人SongsMasterCallback mCallback;    公共SongsMaster(SongsMasterCallback回调){
        mCallback =回调;
    }    @覆盖
    保护列表与LT;地图<字符串,字符串>> doInBackground(虚空...... PARAMS){
        // 像之前一样
    }    @覆盖
    保护无效onPostExecute(列表<地图<字符串,字符串>>的结果){
        mCallback.showSongList(结果);
    }
}

然后声明您的活动实施SongsManager.SongsManagerCallback 并添加方法是:

 无效showSongList(列表<地图<字符串,字符串>>的SongList){
    this.songList =的SongList;
    //然后做一些与此列表
}

Update based on @Tom solution:

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

}

}

end of update

I am working on a class using AsyncTask and below is what i am getting when i try to execute

the error is on the design time so there is no LogCat

here is the class:

SongManager.java

public class SongsManager extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {


// Constructor
public SongsManager(){ }


@Override
    protected ArrayList<HashMap<String, String>>  doInBackground(Void... params) {
        // TODO Auto-generated method stub

        ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

        Xml_Parser_Custom_Listview parser = new Xml_Parser_Custom_Listview();
        String xml = parser.getXmlFromUrl(URL); // getting XML from URL
        Document doc = parser.getDomElement(xml); // getting DOM element

        NodeList nl = doc.getElementsByTagName(KEY_NAME);
        // looping through all song nodes <song>
        for (int i = 0; i < nl.getLength(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            Element e = (Element) nl.item(i);
            // adding each child node to HashMap key => value
            //adding the rows into to the map...

            // adding HashList to ArrayList
            songsList.add(map);
        }

        return songsList;
    }


}

main.java file

trying to execute the AsyncTask:

public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();
songsList = new SongsManager().execute();

here is the error:

Type mismatch: cannot convert from AsyncTask<Void,Void,ArrayList<HashMap<String,String>>> to ArrayList<HashMap<String,String>>

解决方案

The value returned from SongsManager.execute() is not the results of the computation; it's the AsyncTask itself. To publish your results, write a method in SongsManager:

void onPostExecute(ArrayList<HashMap<String,String>> result) {
    songsList = result; // or something similar
    // then update the UI to reflect the results
}

In this method, songsList is the variable to which you are now trying to assign the return value from new SongsManager.execute(). If this variable is not visible to the SongsManager class (e.g., it's not a nested class of your main class), then you'll have to arrange for a call-back:

public class SongsManager
    extends AsyncTask<Void, Void, List<Map<String,String>>
{
    public interface SongsMasterCallback {
        void showSongList(List<Map<String, String>> result);
    }

    private SongsMasterCallback mCallback;

    public SongsMaster(SongsMasterCallback callback) {
        mCallback = callback;
    }

    @Override
    protected List<Map<String, String>>  doInBackground(Void... params) {
        // as before
    }

    @Override
    protected void onPostExecute(List<Map<String, String>> result) {
        mCallback.showSongList(result);
    }
}

Then declare your activity to implement SongsManager.SongsManagerCallback and add is method:

void showSongList(List<Map<String, String>> songList) {
    this.songList = songList;
    // then do something with the list here
}

这篇关于类型不匹配:不能从AsyncTask的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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