アプリの概要では、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 を拡張する新しいクラスにし、そのクラスを作成してメインクラスからキャンバスを渡し、再描画しようとすることでしたが、再びログが表示されますただし、キャンバスに新しい描画はありません。
どうもありがとう!