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.
Tvůrce
Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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
Musíš nad tím vláknem ještě zavolat start.
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();
}
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...
Mne chybu nedava to az v telefóne mi aplikácia padne "Ľutujeme app prestala pracovať"
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.
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();
}
}
}
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.
This seems to me like an incorrect example, since a UI update is being done from a background thread.
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
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 Ale popravde toto som moc nepocho racej by som to cez ten Thread porobil ale asi to nejde
Hej? Tak super, že si to spojazdnil Á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
Zobrazeno 16 zpráv z 16.