从其他线程更改视图 [英] Change View from other thread

查看:151
本文介绍了从其他线程更改视图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我写了一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆