这个线程出了什么问题?它只会运行一次。 (带GPS定位的线程)

时间:2011-09-23 12:13:19

标签: java android multithreading gps

我的活动必须每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);
            }
        }
    }
};
}

1 个答案:

答案 0 :(得分:1)

上次日志调用未刷新,Looper.loop()未结束,或者抛出运行时异常。我首先在Looper.loop()周围添加一个关于Throwable的catch。 由于这些事情对你来说也很明显,我会寻找(1)简单的非重入错误,(2)泄漏资源,特别是未封闭的文件,URL连接。