Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
mara
Člen
Avatar
mara:8.2.2015 14:33

Ahojte, mám problém při vytvoření nového vlákna v android studiu. Kód vypadá takto:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Thread th = new Thread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(getApplicationContext(), "vitej", Toast.LENGTH_LONG).show();
        }
    });
    th.start();
}

vůbec se metoda run neprovede a hodí to chybu. Když ale místo

th.start();

dám

th.run();

tak se provede normálně. Neví někdo proč to tak dělá ?
Děkuji

Odpovědět
8.2.2015 14:33
Co na srdci, to na Facebooku
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na mara
Matěj Kripner:8.2.2015 19:35

Můžeš sem hodit tu chybu, co ti to vyhazuje?

Editováno 8.2.2015 19:35
 
Nahoru Odpovědět
8.2.2015 19:35
Avatar
mara
Člen
Avatar
Odpovídá na Matěj Kripner
mara:8.2.2015 20:06

Díky, ale už jsem to celý překopal a už to jde. Bylo to tím, že zobrazit toast jde jen z hlavního vlákna.

Nahoru Odpovědět
8.2.2015 20:06
Co na srdci, to na Facebooku
Avatar
Afrodisiakum
Člen
Avatar
Afrodisiakum:8.2.2015 20:17

Moc nechápu důvod tohoto vytvoření vlákna a vypsání toastu (ale asi je to jenom pro ukázku). Toast vypsat ze samostatného vlákna opravdu nejde, ale lze využít AsyncTask nebo třeba Handler.

 
Nahoru Odpovědět
8.2.2015 20:17
Avatar
mara
Člen
Avatar
Odpovídá na Afrodisiakum
mara:8.2.2015 22:51

Ano toto bylo jen na ukázku. Zkoušel jsem to, jestli jsem to doteď naprogramoval dobře. Mohl bys mi ukázat, jak to pomocí toho AsyncTask nebo Handleru jde ?
Děkuji

Nahoru Odpovědět
8.2.2015 22:51
Co na srdci, to na Facebooku
Avatar
Afrodisiakum
Člen
Avatar
Afrodisiakum:10.2.2015 12:50

Handler:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startCounter();
    }


    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg){
            Toast.makeText(getApplicationContext(), "Cink cink cink: " + msg.arg1, Toast.LENGTH_SHORT).show();
        }
    };

    private void startCounter(){
        Thread background = new Thread(new Runnable(){
            public void run(){
                try {
                    int counter = 0;
                    while(counter < 10){
                        Thread.sleep(3000);
                        Message msg = new Message();
                        counter += 1;
                        msg.arg1 = counter;
                        handler.sendMessage(msg);
                        //handler.sendMessage(handler.obtainMessage());
                    }

                }catch(Throwable t){

                }
            }
        });

        background.start();
    }
}
 
Nahoru Odpovědět
10.2.2015 12:50
Avatar
Afrodisiakum
Člen
Avatar
Afrodisiakum:10.2.2015 13:15

AsyncTask (velice užitečná třída, doporučuju nastudovat) :). V rychlosti jsem vytvořil snad užitečný příklad.

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new MyAsyncTask().execute();
    }



    private class MyAsyncTask extends AsyncTask<Void, Void, String>{

        ProgressDialog progressDialog;

        /**
         * Provádí nějakou práci v samostatném vlákně mimo UI.
         * (často se používá pro http požadavky
         */
        @Override
        protected String doInBackground(Void... params) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Cink cink cink...";
        }

        /**
         * Metoda se spouští ještě před "doInBackground" a umožňuje zobrazit něco na UI vlákně. Často se používá    právě pro progress dialog
         */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // vytvoření progress dialogu
            progressDialog = new ProgressDialog(MainActivity.this);
            // nastavení titulku
            progressDialog.setTitle("Titulek");
            // nastavení zprávy
            progressDialog.setMessage("Nějaká zpráva");
            progressDialog.setIndeterminate(false);
            // zobrazení dialogu
            progressDialog.show();
        }

        /**
         * Tato metoda se provede ihned po ukončení metody "doInBackground" a přebírá data z "doInBackground".
         * Umožňuje zobrazovat informace na UI vlákně.
         */
        @Override
        protected void onPostExecute(String msg) {
            super.onPostExecute(msg);
            // po obdržení zprávy z metody "doInBackground" ukončíme progress dialog
            progressDialog.dismiss();
            // zobrazime zpravu
            Toast.makeText(MainActivity.this, msg, Toast.LENGTH_LONG).show();
        }
    }
}
Editováno 10.2.2015 13:20
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
10.2.2015 13:15
Avatar
mara
Člen
Avatar
Odpovídá na Afrodisiakum
mara:10.2.2015 14:20

Moc děkuji za ukázku. Přesně toto jsem potřeboval.

Nahoru Odpovědět
10.2.2015 14:20
Co na srdci, to na Facebooku
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.