Несоответствие типов: невозможно преобразовать из AsyncTask - PullRequest
1 голос
/ 13 марта 2012

Обновление на основе решения @Tom:

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обновления

Я работаю над классом, использующим AsyncTask, и ниже я получаю, когда пытаюсь выполнить

ошибка происходит во время разработки, поэтому LogCat * отсутствует1017 *

вот класс:

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

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Это потому, что вы не получаете 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 голосов
/ 13 марта 2012

Значение, возвращаемое из 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...