остановка кнопки потока обработчика - PullRequest
1 голос
/ 10 июня 2019

Каждые 5 секунд я хочу указывать текущую широту для веб-приложения в приложении Android. если пользователь входит в приложение, мы используем пользовательские журналы, размещая кнопки. Если пользователь нажимает кнопку выхода, мне нужно остановить текущий запуск потока обработчика на той же странице активности другой кнопкой (Войти)

Я сделал все, но при остановке потоков мое приложение зависало

если пользователь нажимает кнопку входа в систему, он автоматически отправляет данные каждые 5 секунд

private void techlocation() {
    handler = new Handler ();

    locationManager = (LocationManager) User_deatils .this.getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // Choose your accuracy requirement.
    locationManager.getBestProvider(criteria, true);
    if (ActivityCompat.checkSelfPermission(User_deatils.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(User_deatils.this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        // TODO: Consider calling
        //    ActivityCompat#requestPermissions
        // here to request the missing permissions, and then overriding
        //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
        //                                          int[] grantResults)
        // to handle the case where the user grants the permission. See the documentation
        // for ActivityCompat#requestPermissions for more details.
        return;
    }

    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 8000, 10, (LocationListener) User_deatils .this);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 8000, 10, (LocationListener) User_deatils .this);

    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);


    if (location != null) {
        lat = location.getLatitude();
        lon = location.getLongitude();
    }
    handler.postDelayed(runLocation, 5000);


}

Это работающие потоки, отправляющие данные на серверную сторону

public Runnable runLocation = new Runnable() {
        @Override
        public void run() {
            latitude = String.valueOf(lat);
            longitude = String.valueOf(lon);
            arrLat.add(latitude);
            arrLng.add(longitude);
 User_deatils.this.handler.postDelayed(User_deatils.this.runLocation, 50000);
            handler.removeCallbacksAndMessages(this);
            Log.e("msg", "new" + handler);
    }
}

кнопка входа

b3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               .// SaveButtonState("b3");
                  techlocation(); // calling handler threads

            }
        });

кнопка выхода из системы

b4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            handler.removeCallbacksAndMessages(runLocation);
  }
        });

1 Ответ

0 голосов
/ 10 июня 2019

Для запуска и запуска каждые 5 секунд сделайте это.

Объявите runnable таким образом с флагом boolean.

//, который долженбыть установлен в true, если обработчик должен остановиться

 boolean mStopHandler = false;
private Handler mHandler;

//initialize runnable in oncreate()
mHandler=new Handler();

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // do your stuff here 

        if (!mStopHandler) {
            mHandler.postDelayed(this, 5000);
        }
    }
};

Вызовите это, чтобы запустить runnable на кнопке click()

// start runnable
mHandler.post(runnable);

И, наконец, использоватьэто, чтобы остановить работоспособный

handler.removeCallbacks(runnable);
...