Forum » Programiranje » [Android] setText iz AsyncTask
[Android] setText iz AsyncTask
golobich ::
Pozdravljeni!
Programiram eno aplikacijo za Android OS in sem naletel na en problem.
V podrazredu razreda Activity, imam metodo onCreate znotraj katere rečem tudi setContentView(R.layout.prikaziXML)
V tej XML datoteki imam tudi en TextView, ki bi mu rad spreminjal tekst. Vse mam narjeno pravilno da dobim TextView (findViewById(...)).
Potem sem na en gumb dau onClickListener. Ob kliku naredi nov objekt razreda GetQuestion (vprašanje pridobim iz mysql baze).
Vendar ko preberem vprašanje se mi vsebina TextViewa ne želi spremenit na podano vprašanje.
Predvidevam da je napaka v razredu AsyncTask
Koda:
Kakršna koli pomoč bi bila dobrodošla.
Lp, golobich
Edit: Če debugam, mi je v spremenljivkah "success", "message" in "refren" pravilna vrednost
Programiram eno aplikacijo za Android OS in sem naletel na en problem.
V podrazredu razreda Activity, imam metodo onCreate znotraj katere rečem tudi setContentView(R.layout.prikaziXML)
V tej XML datoteki imam tudi en TextView, ki bi mu rad spreminjal tekst. Vse mam narjeno pravilno da dobim TextView (findViewById(...)).
Potem sem na en gumb dau onClickListener. Ob kliku naredi nov objekt razreda GetQuestion (vprašanje pridobim iz mysql baze).
Vendar ko preberem vprašanje se mi vsebina TextViewa ne želi spremenit na podano vprašanje.
Predvidevam da je napaka v razredu AsyncTask
Koda:
class GetQuestion extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(Igra.this); pDialog.setMessage(getString(R.string.getQuestion)); pDialog.setIndeterminate(false); pDialog.setCancelable(true); pDialog.show(); } @Override protected String doInBackground(String... params) { nacin = 0; int success; String message, refren; String tabela = "skladbe"; String stolpec = "ID_skladbe"; try { List<NameValuePair> parametri = new ArrayList<NameValuePair>(); parametri.add(new BasicNameValuePair("tabela", tabela)); parametri.add(new BasicNameValuePair("stolpec", stolpec)); Log.d("request!", "starting"); JSONObject json = jsonParser.makeHttpRequest(NAKLJUCNA_VRSTICA_URL, "POST", parametri); Log.d("nakljucna vrstica", json.toString()); success = json.getInt(TAG_SUCCESS); message = json.getString(TAG_MESSAGE); refren = json.getString("refren"); if (success == 1) { tv_vprasanje.setText(refren); return message; }else { Log.d("Failed", json.getString(TAG_MESSAGE)); return json.getString(TAG_MESSAGE); } }catch(JSONException ex) { ex.printStackTrace(); } return null; } } protected void onPostExecute(String file_url) { pDialog.dismiss(); if (file_url != null) { Toast.makeText(Igra.this, "Vprasanje", Toast.LENGTH_LONG).show(); } }
Kakršna koli pomoč bi bila dobrodošla.
Lp, golobich
Edit: Če debugam, mi je v spremenljivkah "success", "message" in "refren" pravilna vrednost
- spremenil: golobich ()
Mavrik ::
Jasno, v background threadih NE SMEŠ se dotikati UIja.
Uporabi onProgressUpdate (ki vedno teče na UI threadu) za spreminjanje ter publishProgress() da si pošlješ String tja.
Uporabi onProgressUpdate (ki vedno teče na UI threadu) za spreminjanje ter publishProgress() da si pošlješ String tja.
The truth is rarely pure and never simple.
shadeX ::
Če boš text spremenil samo enkrat, je najbolje postaviti "setText" v onPostExecute metodo (ta se izvrši na main threadu). Če pa hočeš trackati progress pa kakor je Mavrik rekel.
Sicer offtopic. A to je praksa vseh OS-jev, da v background threadu nesmeš se dotikati UI threada?
Sicer offtopic. A to je praksa vseh OS-jev, da v background threadu nesmeš se dotikati UI threada?
Mavrik ::
Ja, nisem še videl OS-a, ki bi pustil updatanje vmesnika z drugega threada (Windows, Linux, OS X, Android, iOS, Symbian ne pustijo).
The truth is rarely pure and never simple.
golobich ::
Hvala za pomoč!
Ampak še vedno sem tukaj obtičal :)
Sedaj je to del kode v metodi doInBackground
in metoda onProgressUpdate(String... progress)
vendar aplikacija crashne.
Mogoče kak namig?
Lp, golobich
Ampak še vedno sem tukaj obtičal :)
Sedaj je to del kode v metodi doInBackground
if (success == 1) { publishProgress(refren); return message; }
in metoda onProgressUpdate(String... progress)
protected void onProgressUpdate(String... progress) { tv_vprasanje.setText(progress[0]); }
vendar aplikacija crashne.
Mogoče kak namig?
Lp, golobich
Mavrik ::
Ja, a bi prebral error message od crasha pa popravil napako? Ali kako ti misliš programirat???
The truth is rarely pure and never simple.
golobich ::
Najprej se opravičujem, vendar sem vse to pisal ko sem bil na vlaku, pa je bila tudi povezava bolj slaba. Po tistem ko sem poslal sporočilo sem popravil sporočilo in tudi log fajl prilimal, vendar očitno ni poslalo :/
Vglavnem, ratalo mi je naredit da se v textview izpiše tisto kar želim.
Maverik in shadeX, najlepša vam hvala!
Lp, golobich
Vglavnem, ratalo mi je naredit da se v textview izpiše tisto kar želim.
Maverik in shadeX, najlepša vam hvala!
Lp, golobich
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C#, OBD2 in branje iz portaOddelek: Programiranje | 1587 (1204) | detroit |
» | Android threadi in asynctaskiOddelek: Programiranje | 1589 (1235) | Kocka |
» | android črtaOddelek: Programiranje | 2411 (1682) | g333kk |
» | [android] vstavljanje slikeOddelek: Programiranje | 1247 (1144) | messi |
» | [Android] končanje threadaOddelek: Programiranje | 932 (782) | Mavrik |