NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Android Studio datá z internetu

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jozef Šustek
Tvůrce
Avatar
Jozef Šustek:18.8.2017 13:46

Ahojte, mám problém. Chcem vo svojej Android appke využívať nejaké datá z interetu. Hľadal som na nete ako na to a našiel som riešenie - teoreticky.

public static void main(String[] args){
        String web = "";
        try{
            URL url = new URL("https://www.itnetwork.cz/java/zaklady");
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
            String line;
            while ((line = bufferedReader.readLine()) != null){
                web += line;
            }
            bufferedReader.close();
        }catch (MalformedURLException e){
        }catch (IOException e){
            e.printStackTrace();
        }
        System.out.println(web);
        }

Keď to vyskúšam cez Eclipse tak mi do konzole vypíše celý zdroják tej stránky ako String čo presne chcem ale v Android Studio namiesto do konzole si to pokusne hádžem na TextView.

textView.setText(web.substring(0,10));

Schválne tam dávam len 10 znakov aby to nahodou nedalo Error.
Lenže applikácia vždy hodí Error. Btw v AndroidManifeste mám povolený Internet. A skúšal som aj Jsoup knižnicu ale vysledok ten istý.
Ak máte s tím nejaké skúsenosti tak prosim poraďte. Ď :)

 
Odpovědět
18.8.2017 13:46
Avatar
Odpovídá na Jozef Šustek
Matúš Olejník:18.8.2017 14:13

Píšem z mobilu keďže vidím že si sa pred pár minútami pýtal a chcem ti skúsiť poradiť čo najskôr.

Chyba by mala byť v tom, že túto funkciu voláš z main threadu. Preto ak chceš robiť takéto veci musíš využiť buď AsyncTask alebo vytvor klasicky nový Thread v ktorom přepíš funkciu run aby sa v novom vlákne vykonalo to čo potrebuješ. Ak sa dostanem k PC môžem poslať kód.

Nahoru Odpovědět
18.8.2017 14:13
/* I am not sure why this works but it fixes the problem */
Avatar
Jozef Šustek
Tvůrce
Avatar
Odpovídá na Matúš Olejník
Jozef Šustek:18.8.2017 14:24

Myslíš takto?

new Thread(new Runnable() {
            @Override
            public void run() {
                //program
        });

Lebo takto som to skusal ale takto mi to skipne celú úlohu aj ked bez erroru :D

 
Nahoru Odpovědět
18.8.2017 14:24
Avatar
Odpovídá na Jozef Šustek
Petr Štechmüller:18.8.2017 14:30

Musíš nad tím vláknem ještě zavolat start.

Nahoru Odpovědět
18.8.2017 14:30
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Jozef Šustek
Matúš Olejník:18.8.2017 14:32

Hej len pred bodkočiarku daj ešte .start()

Nahoru Odpovědět
18.8.2017 14:32
/* I am not sure why this works but it fixes the problem */
Avatar
Jozef Šustek
Tvůrce
Avatar
Jozef Šustek:18.8.2017 14:51

Hmm, tak tam bude asi ešte iný problém. Applikácia padá stále.

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

        final TextView textView = (TextView)findViewById(R.id.textView);
        new Thread(new Runnable() {
            @Override
            public void run() {
                String web = "";
                try{
                    URL url = new URL("https://stackoverflow.com/questions/1921514/how-to-run-a-runnable-thread-in-android");
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
                    String line;
                    while ((line = bufferedReader.readLine()) != null){
                        web += line;
                    }
                    bufferedReader.close();
                }catch (MalformedURLException e){
                }catch (IOException e){
                    e.printStackTrace();
                }
                textView.setText(web.substring(0,10));
            }
        }).start();
    }
 
Nahoru Odpovědět
18.8.2017 14:51
Avatar
Odpovídá na Jozef Šustek
Petr Štechmüller:18.8.2017 14:52

Z jiného vlákna nemůžeš přistupovat ke GUI prvkům, konkrétně

textView.setText(web.substring(0,10));

Ještě sem pro jistotu pošli chybovou hlášku, ale asi to bude ono...

Nahoru Odpovědět
18.8.2017 14:52
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jozef Šustek
Tvůrce
Avatar
Jozef Šustek:18.8.2017 14:54

Mne chybu nedava to az v telefóne mi aplikácia padne "Ľutujeme app prestala pracovať"

 
Nahoru Odpovědět
18.8.2017 14:54
Avatar
Odpovídá na Jozef Šustek
Petr Štechmüller:18.8.2017 14:55

Tak snad to debuguješ přes to android studio.
Když to máš propojený přes kabel, tak se při spuštění aplikace zobrazí základní logování, do kterého se zapisují i chyby.

Nahoru Odpovědět
18.8.2017 14:55
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Matúš Olejník:18.8.2017 14:56

Skús takto:

public class MainActivity extends Activity {

    TextView textView;
    String web = "";
    ProgressDialog mProgress;

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.textView);

        //spusti AsyncTask
        new DownloadData().execute();
    }

    private class DownloadData extends AsyncTask<Void, Void, Void> {

        DownloadData() {

        }

        //vykona sa na pozadi
        @Override
        protected void doInBackground(Void... params) {

            try {
                URL url = new URL("https://www.itnetwork.cz/java/zaklady");
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(url.openStream()));
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    web += line;
                }
                bufferedReader.close();
            } catch (MalformedURLException e) {

            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println(web);
        }

        //pred vykonanim vykresli dialog so spravou
        @Override
        protected void onPreExecute() {
            mProgress = new ProgressDialog(MainActivity.this);
            mProgress.setMessage("Pracujem...");
        }

        //po vykonani skri dialog a vypis data
        @Override
        protected void onPostExecute() {
            mProgress.hide();
            textView.setText(web);
        }

        @Override
        protected void onCancelled() {
            mProgress.hide();
        }
    }
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.8.2017 14:56
/* I am not sure why this works but it fixes the problem */
Avatar
Jozef Šustek
Tvůrce
Avatar
Jozef Šustek:18.8.2017 14:58

V debuggu nemám žiadnu chybu a napr tu stackoverflow.com to na tom príspevku kde je 5 likov urobil tiez ze TextViev nastavil vo vlákne.

Editováno 18.8.2017 14:59
 
Nahoru Odpovědět
18.8.2017 14:58
Avatar
Odpovídá na Jozef Šustek
Petr Štechmüller:18.8.2017 15:00

This seems to me like an incorrect example, since a UI update is being done from a background thread.

Nahoru Odpovědět
18.8.2017 15:00
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jozef Šustek
Tvůrce
Avatar
Jozef Šustek:18.8.2017 15:21

Petr dobre to som si neprecital ale aj ked to dám mimo to vlákno tak sa nic nezmení.
Matúš s tím AsyncTask som vzivote nerobil takze otmu nerozumiem, ale skopiroval som to a je tam plno červenej ani build mi to nezrobilo

08-18 14:48:55.439 9131-9167/com.example.juraj.kurzovakalkulacka E/AndroidRuntime: FATAL EXCEPTION: Thread-8664
                                                                                   Process: com.example.juraj.kurzovakalkulacka, PID: 9131
                                                                                   android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
                                                                                       at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6610)
                                                                                       at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1005)
                                                                                       at android.view.ViewGroup.invalidateChild(ViewGroup.java:4548)
                                                                                       at android.view.View.invalidate(View.java:11229)
                                                                                       at android.view.View.invalidate(View.java:11178)
                                                                                       at android.widget.TextView.checkForRelayout(TextView.java:6807)
                                                                                       at android.widget.TextView.setText(TextView.java:3882)
                                                                                       at android.widget.TextView.setText(TextView.java:3740)
                                                                                       at android.widget.TextView.setText(TextView.java:3715)
                                                                                       at com.example.juraj.kurzovakalkulacka.MainActivity$1.run(MainActivity.java:57)
                                                                                       at java.lang.Thread.run(Thread.java:841)

napr mi tam stále podčiarkuje tie Exception ktoré pritommám v catch bloku, nvm tomu nerozumiem :D

 
Nahoru Odpovědět
18.8.2017 15:21
Avatar
Jozef Šustek
Tvůrce
Avatar
Jozef Šustek:18.8.2017 15:36

OK tak to funguje ale mal si tam chybu v doInBackgroind si mal void ale mne tam pitalo Void a v onPostExecute() to pytalo onPostExecute(Void aVoid). Asi si to pisal na mobile, ak hej tak rešpekt :D Ale popravde toto som moc nepocho :D racej by som to cez ten Thread porobil ale asi to nejde :D

 
Nahoru Odpovědět
18.8.2017 15:36
Avatar
Odpovídá na Jozef Šustek
Matúš Olejník:18.8.2017 15:47

Hej? Tak super, že si to spojazdnil :D Áno, už som si všimol celkovo som v doInBackground mohol vrátiť ten String web a v onPostExecute to použiť pre setText().

Ak chceš tu je to dobre vysvetlené Android Developers

Nahoru Odpovědět
18.8.2017 15:47
/* I am not sure why this works but it fixes the problem */
Avatar
Jozef Šustek
Tvůrce
Avatar
Odpovídá na Matúš Olejník
Jozef Šustek:18.8.2017 16:37

Ďakujem za pomoc, dobra vedomosť do budúcna :)

 
Nahoru Odpovědět
18.8.2017 16:37
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 16 zpráv z 16.