在应用程序的概述中,我从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"函数。这叫做"移动时"。通过此功能,您将需要使您的视图无效。