以Java方式停止线程

时间:2014-04-04 09:12:07

标签: java multithreading

在查看this之后,我试图阻止一个帖子,这就是我所拥有的

Thread restartLocation = new Thread(new Runnable() {
    @Override
    public void run() {
        while (true) {
            try {
                Thread mThis = Thread.currentThread();
                while(restartLocation == mThis) {
                    for(int i = 0; i < 10; i++) {
                        Log.d("Delay", i+" seconds");
                        Thread.sleep(1000);
                    }

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            map.setMyLocationEnabled(true);
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }
});

//When the map is drag stop it update with the users location
//If the user drags the map to look around they dont want it moving back
mf.setOnDragListener(new TouchableWrapper.OnDragListener() {
    @Override
    public void onDrag(MotionEvent motionEvent) {
        map.setMyLocationEnabled(false);
        Log.d("Map", "Stopped location and remove drag listener");
        if (motionEvent.getActionMasked() == MotionEvent.ACTION_UP) {

            //Stop restartLocation if it's running
            restartLocation.start();
        }
    }
});

但是,我在此行while(restartLocation == mThis) {变量上收到错误。可能尚未初始化restartLocation。我该如何解决这个错误?或者,有没有更好的方法可以阻止这个线程?

2 个答案:

答案 0 :(得分:0)

您正尝试在其初始化本身中使用restartLocation引用。它尚未初始化。在初始化之前,您无法使用它。这就是错误的原因!

答案 1 :(得分:0)

使restartLocation成为一个成员变量。由于成员使用默认值进行初始化(在这种情况下为null),因此错误应该消失。

当然这只是一个建议,因为您没有提供有关您的代码运行环境的任何信息。

但是,您的代码包含另一个错误: 必须将匿名类范围之外的变量声明为final才能从匿名类中访问。在您的代码中,您将无法阅读restartLocation,因为它未被声明为final