0

我有一个从 View 扩展的类。在此类的 onDraw(Canvas canvas) 方法中,我将多个位图放在一起并将其显示为画布。我认为 onDraw 方法重复执行。我必须检查我的代码的 SD 卡下载部分中是否不存在位图之一,它会不断发生。我的代码在这里:

protected void onDraw(Canvas canvas) 
{
    super.onDraw(canvas);

    canvas.drawARGB(100, 255, 255, 0);
    canvas.translate(posX, posY);
    canvas.scale(imageScale,imageScale);
    int b = 0;
    for (int a = 0 ; a < 5 ;a++)
    {
        for(int i =0 ; i<4 ; i++)
        {
            if(maptile != null){
                canvas.drawBitmap(maptile,(256*i )  ,(256*a) , null);
                downloading  = false;
                b++;
                }else
                {

                    canvas.drawBitmap(toop,(toop.getWidth()*i )  ,(toop.getHeight()*a) , null);
                    Log.i("Canvas loop", "Showing");
                }

        }   
    }
} 

我的问题是我无法在 onDraw 方法期间连续检查 SDcard。事实上我想检查位图是否在我的存储中,所以显示它。如果没有,则显示另一个位图,直到下载该特定位图。我应该怎么做才能达到这个目标????

编辑: 我在这个类中创建了一个从我的构造函数运行的线程。yhis 线程检查 SD 卡。每当我在 SD 卡中下载特定文件时,将此文件设置为位图。但是当我想重绘视图以显示我的新位图时,应用程序崩溃了。你的想法是什么。有什么问题?

public class SDChecker  implements Runnable
{

    @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())
            {
                maptile= BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/GreatMap/tile0.jpg");
                invalidate();
                Log.i("Create      bit           map", "Bitmap    create");
                Toast.makeText(getContext(), "loadmap tile", Toast.LENGTH_SHORT);
                IMGnotExisting = false;

            }
            else
            {
                IMGnotExisting = true;
            }

        }

    }

}

在 invalidate() 之后,将调用 onDraw() 方法。所以我们有maptile位图。这次它必须绘制maptile位图。但它不会和应用程序崩溃。

4

1 回答 1

0

只有在调用 invalidate() 之后才会调用视图的 onDraw 方法。

只需将视图内的位图初始化为“默认”位图并绘制它而无需任何检查。然后,一旦您的位图准备就绪,将其设置为视图的位图(创建一个设置器)并调用 view.invalidate()。视图将使用新的位图重绘。

请记住回收旧的“默认”位图以节省资源。

于 2013-09-15T12:09:17.723 回答