tutorial thread studio programacion móviles hilos desarrollo curso asynctask asincronos aplicaciones android android-asynctask android-imageview android-handler

android - thread - Cambiar vista desde otro hilo



programacion android pdf 2018 (2)

Escribí un código para descargar una imagen de internet. Y tengo que mostrarlo en un ImageView que se crea dinámicamente.

Y me aparece un error que solo el hilo original que creó una jerarquía de vistas puede tocar sus vistas. Sé que tengo que escribir un identificador, pero ¿cómo puedo hacer eso?

Aquí está mi código:

public class ResimCek implements Runnable { int resimID = 0; public ResimCek(int parcaID) { // store parameter for later user resimID = parcaID; } public void run() { int resID = getResources().getIdentifier(Integer.toString(resimID) , "tag", getPackageName()); ImageView resim = (ImageView) findViewById(resID); Drawable image = ImageOperations(getBaseContext(),"http://141.11.11.206/parca/" + Integer.toString(resimID) + ".jpg" ,"I" + Integer.toString(resimID) + ".jpg"); // I AM GETTING ERROR HERE ****************** resim.setImageDrawable(image); // ************************* } } private Drawable ImageOperations(Context ctx, String url, String saveFilename) { try { InputStream is = (InputStream) this.fetch(url); Drawable d = Drawable.createFromStream(new URL(url).openConnection().getInputStream(),saveFilename); return d; } catch (MalformedURLException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } } public Object fetch(String address) throws MalformedURLException,IOException { URL url = new URL(address); Object content = url.getContent(); return content; } private void MalzemeEkle(String malzemeKodu, String malzemeTanimi) { ImageView parcaresmi = new ImageView(this); parcaresmi.setId(Integer.parseInt(malzemeKodu)); Runnable r = new ResimCek(Integer.parseInt(malzemeKodu)); new Thread(r).start(); }


Debes crear un controlador:

final Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { /*do all your ui action here to display the image ()*/ resim.setImageDrawable(image); } };

Y en tu ejecutable cuando la imagen se descarga, llama:

myHandler.sendEmptyMessage(0);

Hay otras opciones para el controlador que puede encontrar aquí http://developer.android.com/reference/android/os/Handler.html


public class ResimCek implements Runnable { int resimID = 0; public ResimCek(int parcaID) { // store parameter for later user resimID = parcaID; } public void run() { int resID = getResources().getIdentifier(Integer.toString(resimID) , "tag", getPackageName()); ImageView resim = (ImageView) findViewById(resID); Drawable image = ImageOperations(getBaseContext(),"http://141.11.11.206/parca/" + Integer.toString(resimID) + ".jpg" ,"I" + Integer.toString(resimID) + ".jpg"); // I AM GETTING ERROR HERE ****************** resim.setImageDrawable(image); // ************************* } } new Handler().post(new ResimCek(Integer.parseInt(malzemeKodu))); instead of new Thread(r).start();

en cualquier caso, si esto es una Actividad ... entonces

runOnUIThread(new ResimCek(Integer.parseInt(malzemeKodu))); `instead of new Thread(r).start();`

también funcionará ..