java - 这个线程有什么问题?它只运行一次。 (带有 GPS 位置的线程)

标签 java android multithreading gps

我有一个 Activity ,必须每 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);
            }
        }
    }
};
}

最佳答案

要么最后一个日志调用没有刷新,Looper.loop()没有结束,或者抛出运行时异常。我首先会在 Looper.loop() 周围的 Throwable 上添加一个 catch。 由于这些事情对您来说也一定是显而易见的,因此我会寻找 (1) 简单的不可重入错误,(2) 泄漏资源,尤其是未关闭的文件、URL 连接。

关于java - 这个线程有什么问题?它只运行一次。 (带有 GPS 位置的线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7528762/

相关文章:

java - 困惑......关于 HelloAndroid 第一个应用程序

c++ - OpenThread() 返回 NULL Win32

java - 程序中可能出现的舍入问题

java - 在 URL 上的 Conduit 上检测到 Winrm4j 授权循环,领域为 "null"

java - 想要检查另一个 fragment 中的复选框是否已选中

android - 哪些数据库/数据存储支持 iOS 和 Android 的客户端数据同步?

java - JPanel 表单扩展以填充 JScrollpane - 违背了目的

android - 当包含长 TextView 时,scrollview 在 ics(android 4.0)上非常慢

java静态字段会在线程之间同步吗?

python - 如何在Python中与beautifulsoup并行抓取多个html页面?