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