Android 安卓:点击菜单时UI锁定

Android 安卓:点击菜单时UI锁定,android,multithreading,user-interface,Android,Multithreading,User Interface,我有下面的代码,它可以完美地用位图持续更新屏幕 public class render extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new myView(this)); } static { Sy

我有下面的代码,它可以完美地用位图持续更新屏幕

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();
        }
    }
}
公共类呈现扩展活动
{
公共位图mBitmap;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(新myView(this));
}
私有静态本机int[]renderBitmap();
静止的
{
系统加载库(“呈现”);
}
私有类renderTask扩展了异步任务
{       
@凌驾
受保护位图doInBackground(无效…参数)
{
int[]mColors;
mColors=renderBitmap();
mBitmap=Bitmap.createBitmap(mColors,64,64,Bitmap.Config.ARGB_8888);
mBitmap=Bitmap.createScaledBitmap(mBitmap,256,256,false);
返回mBitmap;
}
@凌驾
受保护的void onPostExecute(位图结果)
{
mBitmap=结果;
}
}
类myView扩展了视图
{   
公共myView(上下文)
{
超级(上下文);
}
@凌驾
受保护的void onDraw(画布)
{
新建renderTask().execute();
drawBitmap(mBitmap,112,8,null);
//强制重画
//使无效();
}
}
}

你最好的选择是在后台使用一个按钮来完成繁重的工作。谷歌有一个。

你可能想扩展它,让android在一个单独的线程中管理绘图


有关更好的解释,请参阅《开发指南》:

您必须向我们展示您在创建/显示菜单时所做的工作