forループの本体である次のコードを最適化する方法についてのアイデアを探しています。
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
options.inJustDecodeBounds = false;
ImageButton view = new ImageButton(this);
view.setBackgroundColor(0);
view.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
finalThis.onBorderClicked(v);
}
});
view.setTag(i); //i is the loop counter
Bitmap big = BitmapFactory.decodeResource(getResources(), borders[i], options);
Bitmap smaller = Bitmap.createScaledBitmap(big, borderDimension, borderDimension, false);
view.setImageBitmap(smaller);
view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT));
((LinearLayout.LayoutParams)view.getLayoutParams()).setMargins(0, 0, -5, 0);
group.addView(view);
big.recycle();
基本的に私は600x600の画像を持っていて、それらを約50dpのサイズにしたいです。したがって、当然、最初にサンプルサイズを4(600/4 = 150)に設定して、不要なメモリを占有しないようにし、次に画像を指定されたサイズにさらにサイズ変更します。次に、それを使用してにロードします。ImageButton
また、より大きな、現在は役に立たないものをリサイクルしBitmap
ます。
これは動的なUI作成コードであり、ImageButtons
に追加されHorizontalScrollView
ます。あるケースでは、UIに100以上を追加する必要がImageButtons
あり、このコードは非常に低速です。
問題は、どうすればそれをより速く動作させることができるかということです。現在、で実行されていますが、この場合、MainActivity
マルチスレッド(おそらくAsyncTask
)が役立ちますか?また、ビットマップを目的のサイズにするために、おそらくより高速な方法は他にありますか?このプロセスを大幅に高速化する方法がない場合は、ImageButtonを1つずつ(ただし同じ順序で)段階的に追加して、これらすべてが発生したときにUIがフリーズしないようにする方法はありますか?