2012-03-13 58 views
1

更新轉換基於@湯姆解決方案:類型不匹配:不能從的AsyncTask

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

} 

} 

I a M於一類的工作使用的AsyncTask及以下就是我收到的時候我嘗試執行

錯誤是在設計的時候,所以沒有logcat的

這裏是類:

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文件

試圖執行的AsyncTask:

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

這裏是錯誤:

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

回答

0

SongsManager.execute()返回的值是計算的不是結果;它本身就是AsyncTask。要發佈你的結果,寫一個方法在SongsManager

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

在這種方法中,songsList是可變的,以你現在正試圖返回值從new SongsManager.execute()分配。如果這個變量是不是到SongsManager類別(例如,它不是一個嵌套類主類的)可見,那麼你就必須爲回撥安排:

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

然後宣佈你的活動implement SongsManager.SongsManagerCallback並添加方法是:

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

我怎麼會在main.java文件調用?我嘗試像這樣調用'songsList1 = new SongsManager()。execute();'但是仍然得到相同的錯誤信息......執行onPostExecute – 2012-03-13 18:54:19

+0

@AbuHamzah從'execute()返回的值不是你的結果後臺任務;這是任務本身。不要試圖將其分配給結果類型的變量。你的用戶界面線程需要暫時停下來,而沒有結果。當結果可用時,任務的'onPostExecute'將被調用,並且您可以在那個時候更新UI。 – 2012-03-13 19:03:52

+0

我明白了,但我的用戶界面依賴於'songsList'變量,所以我不確定UI是如何更新'songsLits' – 2012-03-13 19:06:55

0

那是因爲你沒有得到ArrayList<HashMap<String, String>>當您創建/執行的AsyncTask返回。你可以在onPostExecute()上找回它。 您應該創建/執行這樣

SongsManager songsList = new SongsManager().execute(); 

任務,然後有一個onPostExecute在你的AsyncTask這樣

protected void onPostExecute(ArrayList<HashMap<String, String>> result) 
{ 
    // do stuff with the ArrayList<HashMap<String, String>> result parameter. 
} 
+0

是的,我知道了,但仍然得到相同的錯誤消息時我嘗試從main.java文件中調用..就像你顯示的那樣。 – 2012-03-13 18:56:51

相關問題