0
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    mProgressBar = (ProgressBar)findViewById(R.id.adprogress_progressBar);


    final Thread timerThread = new Thread() {

        private volatile boolean running = true;
        public void terminate() {
            running = false;
        }
        @Override
        public void run() {
            while(running) {
            mbActive = true;
                try {
                int waited = 0;
                    while(mbActive && (waited < TIMER_RUNTIME)) {
                    sleep(200);
                        if(mbActive) {
                            waited += 200;
                            updateProgress(waited);
                        }
                    }
                } catch(InterruptedException e) {
                running=false;
                }
            }
        }
    };
    timerThread.start();
}

public void onLocationChanged(Location location) {

    if (location != null) {

        TextView text;
        text = (TextView) findViewById(R.id.t2);
        String str= "Latitude is " + location.getLatitude() + "\nLongitude is " + location.getLongitude();

        text.setText(str);
        text.postInvalidate();
    }

}

如何从 onLocationChanged 停止 onCreate 中的线程?GPS 提供坐标后,我需要停止进度条。我需要使用 join() 加入线程。解决方案会有所帮助。

4

4 回答 4

0

使 timerThread 成为类成员而不是语言环境变量,这样您应该从 onLocationChanged 方法访问它

于 2013-11-07T13:07:57.503 回答
0

改用 AsyncTask,存储 Future 并自己停止线程。

于 2013-11-07T13:09:44.680 回答
0

如果这不是家庭作业,那么我认为没有必要join()。当您尝试将 UI 线程与任意线程连接时更是如此,从而有效地引发ANR

任何一个:

  1. 创建您自己的扩展类Thread,实现您的terminate()方法,然后随时调用它。

  2. 创建您自己的扩展AsyncTask的类,实现 LocationListener,并使用其onProgressUpdate()方法。

于 2013-11-07T13:14:10.323 回答
0

您可以简单地在您的活动中声明一个成员:

private Thread mTimerThread = null;

然后在你的 onCreate() 替换:

final Thread timerThread = new Thread() {

mTimerThread = new Thread() {

并在 onLocationChanged :

if (mTimerThread != null && mTimerThread.isAlive()) {
    mTimerThread.terminate();
}

达到你想要的。

但是,正如其他人提到的那样,我也建议使用自定义AsyncTask,因为在您的情况下,这将是最清晰的线程方式。

于 2013-11-07T13:18:54.130 回答