2017-08-05 15 views
0

スレッドでコードの一部を実行する必要があります。しかし、私はrun()関数から変数へのアクセスに問題があります。変数(関数引数も)はfinalとして定義する必要がありますが、私はこれを行うとrun()関数内で値を変更することはできません。例えば、今の変数ivrun()メソッドではアクセスできません。クラス関数内でスレッドを実行中

この問題を解決する方法はありますか?あなたがここに行うために必要なもの

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = getLayoutInflater(); 

    convertView = getLayoutInflater().inflate(R.layout.gallery_gridsq, parent, false); 
    ImageView iv = (ImageView) convertView.findViewById(R.id.icon); 
    final File file = new File(Uri.parse(getItem(position).toString()).getPath()); 


    Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = null; 
      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inJustDecodeBounds = true; 
      try { 
       BitmapFactory.decodeStream(new FileInputStream(file), null, options); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      options.inJustDecodeBounds = false; 
      options.inSampleSize = 2; 
      try { 
       bmp = BitmapFactory.decodeStream(new FileInputStream(file), null, options); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } 

      iv.setImageBitmap(bmp); 
     } 
    }; 

    new Thread(runnable).start(); 
    return convertView; 
} 
+0

あなたは 'iv'変数を再割り当てしていません...' final'にすることができます –

答えて

0

ivが最終にすることです。このような状況final

final ImageView iv = (ImageView) convertView.findViewById(R.id.icon); 

は、あなたがオブジェクトにivポイント参照を変更できないことを意味しますが、あなたはまだ任意のメソッドを呼び出すことができますそれの。また、各ビューに対して新しいThreadを作成することに注意してください。代わりにExecutorServiceで表されるスレッドプールを使用することをお勧めします。

+0

私はすでにそれを行っています!しかし、今のところそこに画像なしの画像ビューがあります:( – sara

+0

@ saraコード/ logcatをチェックしてください。多分あなたは何らかのエラーがあります;同じストリームを2回デコードしています。 – nikis

関連する問題