我的应用程序中只有一个按钮,其中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()方法中实例化。
任何建议都会令人感激。
答案 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 一旦完成执行,线程可能无法重新启动。