2012-03-13 8 views
1

アップデートを変換することはできません。アップデートの型の不一致:@Tomソリューションに基づいてAsyncTaskから

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

} 

} 

エンドmain.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); 
    } 
} 

SongsManager.java

I a

SongManager:私はそこにはLogCatここ

ではないクラスであるので、エラーがデザイン時にある

を実行しようとすると、メートル以下のAsyncTaskを使ってクラスに取り組んでおり、私が取得していますものです。 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; 
    } 


} 

AsyncTaskを実行しようとしmain.javaファイル

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

はエラーである:SongsManager.execute()から返さ

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

答えて

0

値は計算結果ではありません。それは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

ようなあなたのAsyncTaskでonPostExecuteを持っている必要がありますか?私はこの 'songsList1 = new SongsManager()。execute();'のようにコールしようとしましたが、onPostExecuteを実装した後も同じエラーメッセージを返します。 –

+0

@AbuHamzah 'execute()'から返された値は、バックグラウンドタスク。それは仕事そのものです。結果型の変数に代入しないでください。あなたのUIスレッドは、結果が出ていない瞬間に進む必要があります。結果が利用可能になると、タスクの 'onPostExecute'が呼び出され、その時点でUIを更新することができます。 –

+0

私のUIは 'songsList'変数に依存しているので、どのようにUIが' songsLits'を更新するのか分かりません。 –

0

あなたが得ることはありませんので、ArrayList<HashMap<String, String>>は、作成時に/ AsyncTaskを実行して返される:および追加メソッドです。あなたはそれをonPostExecute()に戻します。 あなたはこの

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

のようなタスクを実行する/作成し、私はmain.javaファイルであること呼び出す方法この

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

はい、私はそれを得ましたが、同じエラーメッセージが表示されます私はmain.javaファイルから呼び出そうとしています..あなたが示したように。 –