我有以下代码,它可以完美地使用位图不断更新屏幕。
public class render extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new myView(this));
}
static {
System.loadLibrary("render");
}
}
class myView extends View
{
private int[] mColors;
private Bitmap mBitmap;
private static native int[] renderBitmap();
public myView(Context context)
{
super(context);
}
@Override
protected void onDraw(Canvas canvas)
{
mColors = renderBitmap();
mBitmap = Bitmap.createBitmap(mColors, 64, 64, Bitmap.Config.ARGB_8888);
mBitmap = Bitmap.createScaledBitmap(mBitmap, 256, 256, false);
canvas.drawBitmap(mBitmap, 8, 8, null);
// force a redraw
invalidate();
}
}
问题是我已经添加了一个选项菜单。 当我按下菜单键时,我的应用程序冻结,我猜是因为 UI 线程被阻止。 处理此问题的最佳方法是什么?
提前谢谢。
编辑:我尝试使用Asynctask但没有成功:
public class render extends Activity
{
public Bitmap mBitmap;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(new myView(this));
}
private static native int[] renderBitmap();
static
{
System.loadLibrary("render");
}
private class renderTask extends AsyncTask<Void, Void, Bitmap>
{
@Override
protected Bitmap doInBackground(Void... params)
{
int[] mColors;
mColors = renderBitmap();
mBitmap = Bitmap.createBitmap(mColors, 64, 64, Bitmap.Config.ARGB_8888);
mBitmap = Bitmap.createScaledBitmap(mBitmap, 256, 256, false);
return mBitmap;
}
@Override
protected void onPostExecute(Bitmap result)
{
mBitmap = result;
}
}
class myView extends View
{
public myView(Context context)
{
super(context);
}
@Override
protected void onDraw(Canvas canvas)
{
new renderTask().execute();
canvas.drawBitmap(mBitmap, 112, 8, null);
// force a redraw
//invalidate();
}
}
}
您可能希望扩展SurfaceView
,让 android 在单独的线程中管理绘图。
有关更好的解释,请参阅开发指南:http://developer.android.com/guide/topics/graphics/index.html
最好的办法是使用 AsyncTask 在后台完成繁重的工作。 谷歌在这里有一个有用的教程。