安卓:点击菜单时UI锁定



我有以下代码,它可以完美地使用位图不断更新屏幕。

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 在后台完成繁重的工作。 谷歌在这里有一个有用的教程。

相关内容

  • 没有找到相关文章

最新更新