从其他线程更改视图 [英] Change View from other thread
本文介绍了从其他线程更改视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我写了一个code,从互联网上下载的图像。我必须表明它在的ImageView
这是动态创建的。
和我得到的只有创建视图层次可以触摸其观点原来的线程错误。我知道我必须写一个手柄,但我怎么能做到这一点?
下面是我的code:
公共类ResimCek实现Runnable { INT resimID = 0; 公共ResimCek(INT parcaID){
//存储参数供以后用户
resimID = parcaID;
} 公共无效的run(){ INT渣油= getResources()则getIdentifier(Integer.toString(resimID),标签,getPackageName());
ImageView的resim =(ImageView的)findViewById(渣油); 绘制的图像= ImageOperations(getBaseContext(),http://141.11.11.206/parca/+ Integer.toString(resimID)+.JPG,I+ Integer.toString(resimID)+.JPG) ; //我得到ERROR HERE ******************
resim.setImageDrawable(图片); // ********
}
} 私人绘制对象ImageOperations(上下文CTX,URL字符串,字符串saveFilename){
尝试{
InputStream为=(InputStream的)this.fetch(URL);
可绘制D = Drawable.createFromStream(新网址(URL).openConnection()的getInputStream(),saveFilename);
返回D组;
}赶上(MalformedURLException的E){
e.printStackTrace();
返回null;
}赶上(IOException异常五){
e.printStackTrace();
返回null;
}
} 公共对象获取(字符串地址)抛出MalformedURLException的,IOException异常{
网址URL =新的URL(地址);
对象内容= url.getContent();
返回的内容;
}
私人无效MalzemeEkle(字符串malzemeKodu,字符串malzemeTanimi){
ImageView的parcaresmi =新ImageView的(本);
parcaresmi.setId(的Integer.parseInt(malzemeKodu));
Runnable接口R =新ResimCek(的Integer.parseInt(malzemeKodu));
新的Thread(R)。开始();
}
解决方案
公共类ResimCek实现Runnable { INT resimID = 0; 公共ResimCek(INT parcaID){
//存储参数供以后用户
resimID = parcaID;
} 公共无效的run(){ INT渣油= getResources()则getIdentifier(Integer.toString(resimID),标签,getPackageName());
ImageView的resim =(ImageView的)findViewById(渣油); 绘制的图像= ImageOperations(getBaseContext(),http://141.11.11.206/parca/+ Integer.toString(resimID)+.JPG,I+ Integer.toString(resimID)+.JPG) ; //我得到ERROR HERE ******************
resim.setImageDrawable(图片); // ********
}
}新的处理程序()后(新ResimCek(的Integer.parseInt(malzemeKodu)));而不是新的Thread(R)。开始();
任何情况下,如果这是一个活动..然后
runOnUIThread(新ResimCek(的Integer.parseInt(malzemeKodu))); `,而不是新的Thread(R)。开始();`
也将工作..
I wrote a code to download an image from internet. And i have to show it in a ImageView
which is dynamically created.
And i am getting an error that Only the original thread that created a view hierarchy can touch its views. I know i have to write a handle but how can i do that?
Here is my code:
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();
}
解决方案
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();
by any case if this is an Activity.. then
runOnUIThread(new ResimCek(Integer.parseInt(malzemeKodu))); `instead of new Thread(r).start();`
will also work..
这篇关于从其他线程更改视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文