» »

[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:
        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.
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?

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
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

shadeX ::

Prilepi LOGCAT sem..

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


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C#, OBD2 in branje iz porta

Oddelek: Programiranje
191476 (1093) detroit
»

Android threadi in asynctaski

Oddelek: Programiranje
231458 (1104) Kocka
»

android črta

Oddelek: Programiranje
412270 (1541) g333kk
»

[android] vstavljanje slike

Oddelek: Programiranje
71143 (1040) messi
»

[Android] končanje threada

Oddelek: Programiranje
6856 (706) Mavrik

Več podobnih tem