当前位置: 首页 > 面试题库 >

Android,线程,无法注销SensorEventListener

南门正祥
2023-03-14
问题内容

public void onCreate(Bundle bundle) {
super.onCreate(bundle);

loopThread();
}

private void loopThread() {
            boolean found = kill;
            System.out.println("Looping until Found!");
            locationThread = new Thread(){
                    private float myacc;

                    @Override
                    @Override
                    public void run() {

                            while (found == false && !kill){
                                    System.out.println("Another Loop!");
                                    getMyLoc();
                                    found = isFound(mylat,mylng,target_lat,target_lng,radius);
                                    try {
                                            synchronized(locationThread){
                                                    locationThread.wait(100);
                                            }

                                    } catch (InterruptedException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                    }
                            }
                            mSensorManager.unregisterListener(senslistener, mAccelerometer);
                            mSensorManager.unregisterListener(senslistener, mGravitometer);
                            mSensorManager.unregisterListener(senslistener);
                            locationThread.interrupt();
                    }
}

@Override
    public void onPause(){
            super.onPause();
            mSensorManager.unregisterListener(senslistener, mAccelerometer);
            mSensorManager.unregisterListener(senslistener, mGravitometer);
            locationThread.interrupt();
    }
    @Override
    public void onResume(){
            super.onResume();
            senslistener = new mySensorEventListener();
            mSensorManager.registerListener(senslistener, mAccelerometer,     SensorManager.SENSOR_DELAY_NORMAL);
            mSensorManager.registerListener(senslistener, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL);
            if (true)
                    loopThread();
    }

private void registerSensors() {
            mSensorManager =     (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
            List<Sensor> mySensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
            if(mySensors.size() > 0){
                    mAccelerometer =     mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                    mGravitometer =     mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

                    mSensorManager.registerListener(senslistener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
                    mSensorManager.registerListener(senslistener, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL);
                    Toast.makeText(context, "Getting your location...", Toast.LENGTH_LONG).show();
            }
            else{
                    Toast.makeText(context, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
            }
    }


public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                    Intent i = new Intent(this, MFLMain.class);
                    if (locationThread != null)
                            if(locationThread.isAlive()){

                    mSensorManager.unregisterListener(senslistener, mAccelerometer);
                    mSensorManager.unregisterListener(senslistener, mGravitometer);
                    mSensorManager.unregisterListener(senslistener);
                    locationThread.interrupt();
                            }
                    locator.stopListener();
                    kill = true;
                    System.out.println("Kill the app "+kill);
                    finish();
                    startActivity(i);
                    return false;
            }
            return super.onKeyDown(keyCode, event);
    }

当我回击以隐藏应用程序并终止活动时,我仍然在logcat中获得system.out。剧院退出了,因为那里没有系统。我很困惑,我不认为范围不是问题,因为sensormanager是通过init方法实例化的。


问题答案:

也许是一个长镜头,但我能看到的与已完成的示例以及您的示例(没有看到其他代码)不同的唯一地方是实现SensorEventListener并将其传递给注册和注销事件,而不是自定义的SensorEventListener。

看到有人通过使用new运算符实例化侦听器和似乎对他有用的答案来尝试这种方式的堆栈溢出。

public class MySensorActivity extends Activity implements SensorEventListener {


public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        ...
        loopThread();
}

  private void loopThread() {
        boolean found = kill;
        System.out.println("Looping until Found!");
        locationThread = new Thread(){
                private float myacc;

                @Override
                @Override
                public void run() {

                        while (found == false && !kill){
                                System.out.println("Another Loop!");
                                getMyLoc();
                                found = isFound(mylat,mylng,target_lat,target_lng,radius);
                                try {
                                        synchronized(locationThread){
                                                locationThread.wait(100);
                                        }

                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                        mSensorManager.unregisterListener(this, mAccelerometer);
                        mSensorManager.unregisterListener(this, mGravitometer);
                        mSensorManager.unregisterListener(this);
                        locationThread.interrupt();
                }
}

@Override
public void onPause(){
        super.onPause();
        mSensorManager.unregisterListener(this, mAccelerometer);
        mSensorManager.unregisterListener(this, mGravitometer);
        locationThread.interrupt();
}
@Override
public void onResume(){
        super.onResume();
        registerSensors();
        mSensorManager.registerListener(this, mAccelerometer,     SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL);
        if (true)
                loopThread();
}

private void registerSensors() {
        mSensorManager =     (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
        List<Sensor> mySensors = mSensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
        if(mySensors.size() > 0){
                mAccelerometer =     mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
                mGravitometer =     mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

                mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
                mSensorManager.registerListener(this, mGravitometer, SensorManager.SENSOR_DELAY_NORMAL);
                Toast.makeText(context, "Getting your location...", Toast.LENGTH_LONG).show();
        }
        else{
                Toast.makeText(context, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
        }
}


 public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
                Intent i = new Intent(this, MFLMain.class);
                if (locationThread != null)
                        if(locationThread.isAlive()){

                mSensorManager.unregisterListener(this, mAccelerometer);
                mSensorManager.unregisterListener(this, mGravitometer);
                mSensorManager.unregisterListener(this);
                locationThread.interrupt();
                        }
                locator.stopListener();
                kill = true;
                System.out.println("Kill the app "+kill);
                finish();
                startActivity(i);
                return false;
        }
        return super.onKeyDown(keyCode, event);
}


 类似资料:
  • 用户无法注销Firebase Android。当我按注销按钮时,它不会注销。 代码在这里:- 日志包括: 02-13 23:54:19.654 307 3-3073/com.example.imran.bloodgenders i/view:Touch down dispatch to android.widget.button{42d3afa0 vfed..........120,594-600

  • 我在Spring Boot应用程序中定制了Spring Security性的实现。所以我有我的依赖项,还有一个名为SecurityImpl的类,它为我实现了登录访问。当我进入浏览器时,系统会正确地要求我登录并发出警报。当我登录时,我可以正确访问Spring控制器的所有@RequestMapping。但我始终保持记录。即使我从浏览器中删除了JSESSIONID,当我发出另一个http请求时,我也会被

  • 它给出: 下面是我使用的代码: 方法verifyUserExistance是; 我就是这样处理注销的;

  • 我通过在自定义登录API中生成JWT(JSON Web Token)在Azure移动服务中使用自定义身份验证。一旦用户拥有JWT,它将一直有效,直到达到其编码的过期时间。 除了在每个经过身份验证的请求上根据会话表显式检查JWT令牌之外,是否有办法在JWT令牌到期之前使其失效(当用户注销时会发生这种情况),以便任何后续使用该令牌作为头中的值发出的请求都不会到达任何表API或自定义API脚本?

  • 我正在开发jsp springboot应用程序,我已经使用azure实现了sso,它正在按预期工作。我已配置 此外,我还在应用程序中添加了重定向url。属性,我没有添加任何配置类,除了这些更改,我能够成功登录。对于注销,我使用 但是如果我打开一个新标签并尝试访问该应用程序,我将能够在不要求登录的情况下访问该应用程序。我不确定我必须做哪些更改来防止这种情况

  • 问题内容: 我正在考虑为我的应用程序使用OAuth2。我尝试实现的体系结构如下: 我将拥有自己的(仅此)授权服务器 一些资源应用程序使用授权服务器验证对资源的访问 某些客户端应用程序(网络,移动设备)会将用户重定向到授权服务器进行身份验证,如果成功,则会在资源应用程序上使用api。 到目前为止,我已经成功实现了3个基本应用程序(1个身份验证服务器,1个资源服务器和1个客户端)之间的交互。我无法正常