【问题标题】:Change View from other thread从其他线程更改视图
【发布时间】:2012-04-18 12:55:57
【问题描述】:

我编写了一个从互联网下载图像的代码。我必须在动态创建的ImageView 中显示它。

我得到一个错误,只有创建视图层次结构的原始线程才能触及它的视图。我知道我必须写一个句柄,但我该怎么做呢?

这是我的代码:

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(); 
}

【问题讨论】:

    标签: android android-asynctask android-imageview android-handler


    【解决方案1】:
    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(); 
    

    无论如何,如果这是一个活动..那么

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

    也可以..

    【讨论】:

    • 谢谢,如果你向下滚动我发布的代码,你可以看到代码 Runnable r = new ResimCek(Integer.parseInt(malzemeKodu));新线程(r).start();我怎样才能从我的 MalzemeEkle 函数中调用它。
    【解决方案2】:

    你应该创建一个处理程序:

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

    并在您的可运行文件中下载图像时调用:

    myHandler.sendEmptyMessage(0);
    

    您可以在此处找到处理程序的其他选项 http://developer.android.com/reference/android/os/Handler.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多