Android: пользовательский интерфейс блокируется при нажатии меню - PullRequest
0 голосов
/ 19 мая 2011

У меня есть следующий код, который отлично работает для постоянного обновления экрана с помощью растрового изображения.

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();
    }
}

Проблема в том, что я добавил меню опций. Когда я нажимаю клавишу меню, мое приложение зависает, я думаю, потому что поток пользовательского интерфейса заблокирован. Каков наилучший способ справиться с этим?

Заранее спасибо.

Редактировать: я пытался использовать 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();
        }
    }
}

Ответы [ 2 ]

1 голос
/ 19 мая 2011

Вместо этого вы можете захотеть расширить SurfaceView, чтобы позволить Android управлять чертежом в отдельном потоке.

Более подробное объяснение см. В руководстве разработчика: http://developer.android.com/guide/topics/graphics/index.html

0 голосов
/ 19 мая 2011

Лучше всего использовать AsyncTask для выполнения тяжелой работы в фоновом режиме. У Google есть полезное руководство здесь .

...