0

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

どうもありがとう!

4

1 に答える 1

2

描画とすべての UI は、メイン スレッドで実行する必要があります。あなたがすべきことは、別のスレッドで GPS 更新を実行してから、メイン スレッドから再描画されるようにサーフェスを無効にすることです。

編集:もう少し読んでください(GPSで遊んでからしばらく経ちました)。LocationListener を定義すると、「onLocationChanged」関数が作成されます。移動すると呼び出されます。この関数から、ビューを無効にする必要があります。

于 2013-07-01T07:06:59.930 に答える