我的活动必须每500毫秒捕获用户的GPS位置并将其写在屏幕上(Textview tv2)。但是出了点问题
它只捕获模拟器的DDMS发送的GPS位置一次,然后我在代码(方法run()
)上放了一些日志打印来检查线程,我看到打印件只写了一个日志猫的时间。
最后的日志打印永远不会被称为.... wtf。我的意思是这个打印:Log.w("PABLO", "despues loop");
它永远不会被调用....就像线程在Looper.loop之后停止一样。
这是代码:
public class AugmentedRealitySampleActivity extends Activity implements Runnable{
private TextView tv2;
//variables para obtener mi posicion:
LocationManager mLocationManager;
Location mLocation;
MyLocationListener mLocationListener;
Location currentLocation = null;
double lat=-1;
double lon=-1;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FrameLayout rl = new FrameLayout(this.getApplicationContext());
LinearLayout ll= new LinearLayout(this.getApplicationContext());
ll.setOrientation(LinearLayout.VERTICAL);
setContentView(rl);
rl.addView(ll);
tv2=new TextView(getApplicationContext());
tv2.setBackgroundColor(Color.BLACK);
ll.addView(tv2);
tv2.setText("Test2");
Log.w("PABLO", "on create");
Thread thread = new Thread(this);
thread.start();
}
////////////////////////////////////////////////////////////////////////
//Métodos del Hilo que obtiene la posicion GPS del usuario periodicamente.
///////////////////////////////////////////////////////////////////////
public void run() {
mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
Log.w("PABLO", "principio hilo");
Looper.prepare();
mLocationListener = new MyLocationListener();
try{
Log.w("PABLO", "antes mLocationManager");
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 0, mLocationListener);
Log.w("PABLO", "despues mLocationManager");
}catch(Exception e){}
//try {
// wait(100);
//}catch (InterruptedException e) {}
Log.w("PABLO", "antes loop");
Looper.loop();
Log.w("PABLO", "despues loop");
}
}
private class MyLocationListener implements LocationListener
{
public void onLocationChanged(Location loc) {
if (loc != null) {
try{
currentLocation = loc;
handler.sendEmptyMessage(0);
}catch(Exception e){}
}
}
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
}
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (currentLocation!=null)
{
lat=currentLocation.getLatitude();
lon=currentLocation.getLongitude();
if (lat==-1 && lon ==-1) /// si no existe ninguna posicion GPS anterior en el telefono, no hago nada
{
}
else //// si existe alguna posicion anterior (es decir, si el GPS del telefono ha sido activado al menos alguna vez en su vida util)
{
tv2.setText("Location= "+lat+" "+lon);
}
}
}
};
}
答案 0 :(得分:1)
上次日志调用未刷新,Looper.loop()未结束,或者抛出运行时异常。我首先在Looper.loop()周围添加一个关于Throwable的catch。 由于这些事情对你来说也很明显,我会寻找(1)简单的非重入错误,(2)泄漏资源,特别是未封闭的文件,URL连接。