类型不匹配:不能从AsyncTask的转换 [英] Type mismatch: cannot convert from 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()返回值code>。如果这个变量不是在
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屋!