ArrayList return z AsyncTask

0

Witam to znowu Ja! :P
Wybaczcie, że kolejny temat zakładam, ale w żaden poprzedni raczej nie mógłbym tego podpiąć. Czytałem również na ten temat w google, ale niezbyt doszedłem do rozwiązania. Już piszę o co chodzi:
Z mojego Activity tworzę obiekt klasy, która dziedziczy po AsyncTask. W doInBackground() odpalam funkcję, która wysyła post do WebService i zwraca XML. Następnie przekazuje XML do onPostExecute(), a tam odpalam funkcje, która przerabia mi go na ArrayListę<obiekt> i ją zwraca. Aktualnie widok Activity zmieniam z onPostExecute, ale wolałbym żeby wyglądało to w ten sposób:

  @Override
                protected void onCreate(Bundle savedInstanceState) {
 
 
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_custom_list_view_android_example);
                     
                    CustomListView = this;
                     
                    /******** Take some data in Arraylist ( CustomListViewValuesArr ) ***********/
                    setListData();
                     
                    Resources res =getResources();
                    lis t= ( ListView )findViewById( R.id.list );  // List defined in XML ( See Below )
                     
                    /**************** Create Custom Adapter *********/
                    adapter=new CustomAdapter( CustomListView, CustomListViewValuesArr,res );
                    list.setAdapter( adapter );
                     
                }

Przejrzyście, wszystko ładnie poukładane. Problem polega na tym, że nie wiem jak zwrócić ArrayListę do Activity. A tak o to odpalam cały system, który wcześniej opisałem (GetEvents jest funkcją w Activity odpalam ją w protected void onCreate(Bundle savedInstanceState)):

public void GetEvents(){
        new WebServiceClient(username, password, "GetEvents", xml, this, this).execute();
	}

WebServiceClient to klasa dziedzicząca po AsyncTask. Także w tym miejscu byłby return. Gdy próbuję tu przypisać returna do zmiennej to piszę, że musi być typu AsyncTask.
Jak to zrobić ? ? ? ?
PS.
Tego typu pytania powinny znaleźć się w Newbie czy w Java?
Pozdrawiam NieZnasz !

1

Po to właśnie jest metoda onPostExecute.. stwórz w aktywności metodę która jako argument przyjmuje tego ArrayLista i wywołaj ją w onPostExecute.

0

Pojawiło się parę innych problemów jak przeniosłem Array tak jak napisałeś. Poprawiłem Je bo np. nie widział contextu, ale został mi jeden, a mianowicie nie wiem jak ściągnąć ListView przez findById, pada aplikacja (Class file editor plik Activity.class).
A dlaczego jak wcześniej ustawiłem zmienną context, która jest dostępna w całej klasie, i ArrayLista wróciła do funkcji w tej właśnie klasie to dla niego zmienna context jet pusta? Musiałem ją łapać na nowo i to zwykłym sposobem "context = getApplicationContext();" nie działało?

kod:

  public void ShowList(String result){
    	
    	context = getAppContext();
    	XmlHelper xmlHelp = new XmlHelper();
    	list_image = xmlHelp.GetList(result);
    	AdapterListy adapter;
    	adapter = new AdapterListy(context, list_image, res);
    	ListView list = (ListView) findViewById(R.id.lv_prostalista);
        list.setAdapter( adapter );
	}
0
 @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		MainActivity.context = getApplicationContext();
		res =getResources();
		GetList(start, finish);
		list = (ListView) findViewById(R.id.lv_prostalista);
}

///ASYNCTASK
@Override
	protected String doInBackground(Object... arg0) {
        String s = Send();
		return s;
	}
	
	@Override
	protected void onPostExecute(Object obj) {
		String result = obj.toString();
		MainActivity main = new MainActivity();
		main.ShowList(result);
    }
/// Znowu MainActivity

  public void ShowList(String result){
    	
    	context = getAppContext();
    	XmlHelper xmlHelp = new XmlHelper();
    	list_image = xmlHelp.GetList(result);
    	AdapterListy adapter;
    	adapter = new AdapterListy(context, list_image, res);
    	ListView list = (ListView) findViewById(R.id.lv_prostalista);
        list.setAdapter( adapter );
	}
	   
0

Nie tak. Aktywność musisz przekazać w konstruktorze asyncTaska. Tworzysz nową aktywność poprzez operator new co jest lekko WTF ;) Z tym że, przekazując aktywność do asyncTaska musisz się zabezpieczyć przed memory leakiem, który może wystąpić gdy task będzie dalej trwał a aktywność zostanie wcześniej ubita.

0

Dobra to ja Wam pokażę jak Ja to napisałem bo coś mi tu się nie zgadza. Tak jak piszesz Bolson nic nie widzi.

 public void GetList(String start, String finish){
        String xml = xmlHeader + xmlBody + xmlFooter;
        new WebServiceClient(username, password, "GetVisibleImages", xml, activity, start, finish).execute();
	}

Teraz AsyncTask:

public class WebServiceClient extends AsyncTask {
	private final String Url = "http://192.168.1.169/Selfie/Interfaces/";
	String login;
	String pass;
	String command;
	String xml;
	String start;
	String finish;
	Activity act;
	
	public WebServiceClient(String login, String pass, String command,
			String xml, Activity act, String start, String finish) {
		this.login = login;
		this.pass = pass;
		this.command = command;
		this.xml = xml;
		this.start = start;
		this.finish = finish;
		this.act = act;
		

	@Override
	protected String doInBackground(Object... arg0) {
        String s = Send();
		return s;
	}
	
	@Override
	protected void onPostExecute(Object obj) {
		String result = obj.toString();
		act.Showlist(result);
    }
	}

ACT nie widzi ShowList

1

Przekazujesz jako typ Activity, a Activity samo w sobie nie posiada metody ShowList. Musisz przekazać jako MainActivity, ew. zrobić rzutowanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1