1

我写了一个代码从互联网下载图像。我必须在动态创建的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(); 
} 

回答

2
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();` 

也将工作..

+0

感谢,如果你向下滚动我贴的代码,你可以看到代码Runnable r = new ResimCek(Integer.parseInt(malzemeKodu)); new Thread(r).start(); 我怎么能从我的MalzemeEkle函数中调用它。 – 2012-04-18 13:05:29

+0

@GKSoft ..看到我编辑的答案.. – ngesh 2012-04-18 13:07:35

1

您应该创建一个处理者:

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