无法在View中调用onDraw方法

时间:2013-09-25 07:57:42

标签: android multithreading canvas

我想在自定义视图中的onDraw()方法中创建类似拼图(将图像放在一起)的内容。所以起初我打电话给它并显示我的整个谜题。 但过了一段时间我想改变我的拼图图像。所以当我从另一个线程更改图像源并使()无效时,可能会强制应用程序关闭。 从你的角度来看,我该怎样做才能达到这个目标? 这是我的代码:

protected void onDraw(Canvas canvas) 
{
    super.onDraw(canvas);
    canvas.drawARGB(100, 255, 255, 0);
    canvas.translate(posX, posY);
    canvas.scale(imageScale,imageScale);
        InitDrawing(canvas);

}

 public void InitDrawing(Canvas canvas)
{
    for (int a = 0 ; a < 5 ;a++)
    {
        for(int i =0 ; i<4 ; i++)
        {
            canvas.drawBitmap(toop,(toop.getWidth()*i )  ,(toop.getHeight()*a) , null);
            downloading  = true;
            IMGnotExisting = true;
            Log.i("Canvas loop", "Showing");

        }   
    }
}


public class SDChecker  implements Runnable
{
    public SDChecker()
    {
//          String name = s;
        PauseTHR = new Object();
        pause = false;
    }
    @Override
    public void run() 
    {
//          while( true)
//          {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            File file = new File(Environment.getExternalStorageDirectory()+ "/GreatMap","tile0.jpg");
            if (file.exists())
            {
                toop = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/GreatMap/tile0.jpg");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                invalidate();
                Log.i("Create      bit           map", "Bitmap    create");
//                  Toast.makeText(getContext(), "loadmap tile", Toast.LENGTH_SHORT);
                IMGnotExisting = false;

            }
            else
            {
                IMGnotExisting = true;
            }
    }
}

1 个答案:

答案 0 :(得分:2)

仅从UI线程调用invalidate。 要在UI线程之外调用invalidate,请使用postInvalidate()

希望这有帮助。