在android上使用线程的实时绘图

时间:2014-10-09 07:34:09

标签: android multithreading map android-asynctask gps

我的应用程序中只有一个按钮,其中onClick,我需要它来开始收集gps点并使用它进行一些处理并再次点击,我需要它来停止该过程。 当线程运行时,收集的点将被推入sqlite数据库,并且我将使用收集的gps点激活按钮时在地图上绘制线条。

我的问题是如何实现该线程以及哪种方式最安全。 扩展AsyncTask类似乎是一个强大的解决方案,但它只运行一次,我需要这个线程可以像切换按钮一样多次使用。 我尝试了以下测试,看看我是否可以在我的应用程序中维护一个简单的线程,但它不起作用。我不能使用stop()方法。 然后我开始我的线程然后通过在while循环中伪造控制器来停止,start()方法再次启动它只是崩溃。

class RunBuffer implements Runnable{

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(toggleBufferIsActive){
            try {
                Thread.sleep(1000);
                test++;
                Log.v("Thread running", String.valueOf(test));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

和我的切换按钮实现如下:

public void ToggleBuffer(View view) {

    if(this.toggleBufferIsActive){
        this.locationManager.removeUpdates(this.locationListener);
        this.gpsLatLongCollectionSize = 0;
        // TODO stop collecting and drawing buffer polygon thread
        this.toggleBufferIsActive = false;
    }
    else{
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
                0, locationListener);
        // TODO start collecting and drawing buffer polygon thread
        this.toggleBufferIsActive = true;
        runBuffer.start();   // crashes here
    }
}

我的runBuffer对象属于RunBuffer类型,并在我的活动中的onCreate()方法中实例化。

任何建议都会令人感激。

1 个答案:

答案 0 :(得分:0)

  

我的runBuffer对象是RunBuffer类型并在我的实例化中实例化   我活动中的onCreate()方法。

这是不可能的。 runBuffer不能是RunBuffer的实例,因为它扩展了Runnable。所以你可能将它包装在一个Thread中。类似的东西:

 Thread runBuffer = new Thread(new RunBuffer());
 runBuffer.start();

在设定之后让我们假设

   this.toggleBufferIsActive = false;

while循环正确结束。在这种情况下,您正在尝试restart,这是无法完成的。 doc:

Thread.start()方法的摘录
  

不止一次启动线程永远不合法。特别是,a   一旦完成执行,线程可能无法重新启动。