在画布上绘制从多线程Android 17



在应用程序的概述中,我从SurfaceView上的相机获得了提要,我想根据gps位置在上面绘制(我想听起来很熟悉)。所以为了在不阻塞实时提要的情况下更新画布,我需要一个新线程?代码:

@Override
public void draw(Canvas canvas1) {
    Log.w("MyActivity","DRAW");
    canvas = canvas1;
    super.draw(canvas);
    Paint p = new Paint();
    p.setColor(Color.RED);
    canvas.drawCircle(canvas.getWidth()/2,canvas.getHeight()/2,30,p);
    String output = "";
    output = "Current longitude:" + Double.toString(gpsGo.RequestLocationUpdate().getLongitude()) + " latitude: " + Double.toString(gpsGo.RequestLocationUpdate().getLatitude());
    canvas.drawText(output,canvas.getWidth()/(5 - rand.nextInt(5)) + min,canvas.getHeight() - canvas.getHeight()/(5 - rand.nextInt(5)) + min,p);
    Thread thread = new Thread()
    {
        @Override
        public void run() {
            Looper.prepare();
        mHandler = new Handler();
        r = new Runnable()
        {
            public void run()
            {
                Log.v(TAG, "PRE REDRAW ");
                ReDraw();
                Log.v(TAG,"AFTER REDRAW ");
                mHandler.postDelayed(this, 10000);
            }
        };
            Looper.loop();
        }
    };
    thread.start();
}

ReDraw所在位置:

    public void ReDraw()
{
    Log.v("MyActivity","INNER START REDRAW ");
    Paint p = new Paint();
    p.setColor(Color.RED);
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    canvas.drawCircle(canvas.getWidth()/4,canvas.getHeight()/5,60,p);
    String output = "";
    output = "Current longitude:" + Double.toString(gpsGo.RequestLocationUpdate().getLongitude()) + " latitude: " + Double.toString(gpsGo.RequestLocationUpdate().getLatitude());
    canvas.drawText(output,canvas.getWidth()/2,canvas.getHeight() - canvas.getHeight()/3,p);
    Log.v("MyActivity","INNER END REDRAW ");
}

在日志中,我看到了日志,但屏幕上没有任何新的内容。我知道这不是处理新线程的最佳方式,但它只是试图找出它不起作用的原因。

我尝试过的另一种方法是将Thread Thread=new Thread(){…}放入一个扩展Thread的新类中,然后创建该类。从主类传递画布并尝试重新绘制,但我再次看到日志,但画布上没有任何新的绘图。

非常感谢!

绘图和任何UI内容都必须出现在主线程上。你应该做的是在一个单独的线程中运行GPS更新,然后使你的曲面无效,以便它从主线程重新绘制。

编辑:阅读更多(我玩GPS已经有一段时间了)。您定义了一个LocationListener,并且您有一个"onLocationChanged"函数。这叫做"移动时"。通过此功能,您将需要使您的视图无效。

最新更新