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

感謝を見つけることができます

myHandler.sendEmptyMessage(0); 

ハンドラの他のオプションがありますが、あなたが見ることができますコードRunnable r =新しいResimCek(Integer.parseInt(malzemeKodu)); 新しいスレッド(r).start(); 私はどのように私のMalzemeEkle関数から呼び出すことができます。 –

+0

@GKSoft ..私の編集された答えを見てください.. – ngesh

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

そして、あなたの実行可能イメージがダウンロードされる通話中:あなたは私の投稿のコードを下にスクロールする場合は、ここで http://developer.android.com/reference/android/os/Handler.html

関連する問題