Avatar
mara
Člen
Avatar
mara:

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
Redaktor
Avatar
Odpovídá na mara
Matěj Kripner:

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
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
mara
Člen
Avatar
Odpovídá na Matěj Kripner
mara:

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:

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:

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:

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:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 10.2.2015 13:15
Avatar
mara
Člen
Avatar
Odpovídá na Afrodisiakum
mara:

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.