AsyncTask - wywoływanie - ANDROID

0

Mam AsyncTaska do połączenia HTTP i pobrania danych, w metodzie onPostExecute zmieniam dane kilku TextView. Wiem, że mogę wykonywać tylko jedno zadanie AsyncTask w metodzie OnCreate w mainActivity. Chciałbym, żeby ten AsyncTask wywoływał się po naciśnięciu przycisku i zmieniał mi po prostu te tekstView, które mam w mainActivity. Chyba trochę poplątałem. Wrzucam kod onCreate w mainActivity tego jak próbowałem to zrobić:

    
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        miastko = "London,UK";
       miasto         = (TextView) findViewById(R.id.miasto);
       opisWarunkow   = (TextView) findViewById(R.id.opisWarunkow);
       temperatura    = (TextView) findViewById(R.id.temperatura);
       predkoscWiatru = (TextView) findViewById(R.id.wilgotnosc);
       windDeg     =    (TextView) findViewById(R.id.cisnienie);
       cisnienie   =    (TextView) findViewById(R.id.predkoscWiatru);
       wilgotnosc  =    (TextView) findViewById(R.id.windDeg);
       ikonka      =   (ImageView) findViewById(R.id.ikonka);




           JSONPogodaTask task = new JSONPogodaTask();
           task.execute(new String[]{miastko});



        zmianaMiastaPrzycisk.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick (View v){
            EditText zmianaMiasta = (EditText) findViewById(R.id.zmianaMiasta);
            miastko = zmianaMiasta.getText().toString();
            JSONPogodaTask task1 = new JSONPogodaTask();
            task1.execute(new String[]{miastko});


        }
        });


    }
0

A skąd Twój AsyncTask ma wiedzieć jakie widoki ma zmienic w onPostExecute?

0

AsyncTask działa i ma się dobrze, robi to co powinien, umiem wywołać go jednorazowo. Mi chodzi tylko o to, żeby wywoływać go po naciśnięciu przycisku. A uściślając, ten AsyncTask pobiera dane z serwera, parser parsuje je z formatu JSON do klasy z pogodą i następnie wyświetlam to już właśnie w tym OnPostExecute. (W doInBackground jest pobranie z serwera i parsowanie.) Inaczej mówiąc chcę, żeby info o pogodzie odświeżało się po zmianie miasta.

 protected void onPostExecute(Pogoda pogoda) {
            super.onPostExecute(pogoda);
         zmiana=false;
   miasto.setText(pogoda.lokalizacja.getMiasto() + "," + pogoda.lokalizacja.getKraj());
                if (pogoda.daneIkony != null && pogoda.daneIkony.length > 0) {
                Bitmap img = BitmapFactory.decodeByteArray(pogoda.daneIkony, 0, pogoda.daneIkony.length);
                ikonka.setImageBitmap(img);
            }

            miasto.setText(pogoda.lokalizacja.getMiasto() + "," + pogoda.lokalizacja.getKraj());
            opisWarunkow.setText(pogoda.warunkiPogodowe.getWarunki() + "(" + pogoda.warunkiPogodowe.getOpis() + ")");
            temperatura.setText("" + Math.round((pogoda.temperatura.getTemperatura() - 273.15)) + "�C");
            wilgotnosc.setText("" + pogoda.warunkiPogodowe.getWilgotnosc() + "%");
            cisnienie.setText("" + pogoda.warunkiPogodowe.getCisnienie() + " hPa");
            predkoscWiatru.setText("" + pogoda.wiatr.getPredkosc() + " mps");
            windDeg.setText("" + pogoda.wiatr.getDeg() + "�");



        }
0

no ale masz to przecież zrobione.
Pokaż teraz kod AsyncTaska z propozycją jak chciałbyś aktualizować widok w metodzie onPostExecute

No i musisz jeszcze w onCreate dopisać rzutowanie na Button obietku zmianaMiastaPrzycisk bo go nie widzę w onCreate

0

Jak w metodzie onPost? Nie powinno być tego w main activity. Przecież muszę za każdym razem pobrać na nowo dane z serwera, więc tak jakby wywołać ASYNca od początku? Źle rozumuję?

0

Maly offteop: poczytaj troche w necie o problemach z AsyncTask i jakie crashe moze to powodowac, i jakie sa alternatywy.

0

No w metodzie onPost masz setText dla TextView miasto etc etc. To jest ok.

Ale kliknięcie przycisku Ci nie działa przecież, bo nie masz tego podpiętego. Więc aplikacja nie reaguje na kliknięcie

0
the real mućka napisał(a):

Maly offteop: poczytaj troche w necie o problemach z AsyncTask i jakie crashe moze to powodowac, i jakie sa alternatywy.

Na pewno sprawdzę ;) Ale na razie chciałbym skumać jak to powinno działać w tym przypadku ;)

EDIT:

panryz napisał(a):

No w metodzie onPost masz setText dla TextView miasto etc etc. To jest ok.

Ale kliknięcie przycisku Ci nie działa przecież, bo nie masz tego podpiętego. Więc aplikacja nie reaguje na kliknięcie

Jak podpiętego? Chodzi o odświeżenie zawartości klasy pogoda. Przecież nawet jak podepnę guzik w metodzie onPostExecute to już ta akcja "będzie się rozgrywać po tym co się działo w background (pobieranie, parsowanie)"... Mógłbyś podpowiedzieć jak to zakodować?

1
 
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        miastko = "London,UK";
       miasto         = (TextView) findViewById(R.id.miasto);
       opisWarunkow   = (TextView) findViewById(R.id.opisWarunkow);
       temperatura    = (TextView) findViewById(R.id.temperatura);
       predkoscWiatru = (TextView) findViewById(R.id.wilgotnosc);
       windDeg     =    (TextView) findViewById(R.id.cisnienie);
       cisnienie   =    (TextView) findViewById(R.id.predkoscWiatru);
       wilgotnosc  =    (TextView) findViewById(R.id.windDeg);
       ikonka      =   (ImageView) findViewById(R.id.ikonka);
 
 
      Button zmianaMiastaPrzycisk = (Button) findViewById(R.id.TWOJE_ID_BUTTONA_Z_XML);
 
           JSONPogodaTask task = new JSONPogodaTask();
           task.execute(new String[]{miastko});
 
 
 
        zmianaMiastaPrzycisk.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick (View v){
            EditText zmianaMiasta = (EditText) findViewById(R.id.zmianaMiasta);
            miastko = zmianaMiasta.getText().toString();
            JSONPogodaTask task1 = new JSONPogodaTask();
            task1.execute(new String[]{miastko});
 
 
        }
        });
 
 
    }
0

Bardzo dziękuję, faktycznie apka padała przez taką głupotę. Mam jeszcze techniczne pytanie, zastanawiam się czy gdy wywołuję sobie tego async taska za każdym razem gdy chcę pobrać pogodę dla innego miasta, to czy nie powinienem jakoś zabijać poprzednich instancji tego async taska? Dokładniej chodzi mi o to czy po kilku zmianach miasta nie mam kilku procesów/wątków w tle?

0

Czyli rozumiem, że kiedy async dostaje status finished, nie mam się czym martwić?

0

Powinieneś ubić stary task jeżeli chcesz wystartować nowy. AsyncTask wykonywane sa jeden po drugim na większości wersji androida, tak więc dopóki nie zakończysz jednego asynctaska drugi nie zacznie się wykonywać co doprowadzi do opóźnień.
Jeżeli musisz wykonać parę asynctasków równocześnie / niezależnie od siebie to możesz to zrobić po modyfikacji rozmiaru puli wątków executora

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