Проблема с Handler и Activity

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
tolik777
Сообщения: 37
Зарегистрирован: 06 июл 2012, 14:25

Проблема с Handler и Activity

Сообщение tolik777 » 13 фев 2013, 08:58

По примеру с данного сайта в приложении реализовал обмен сообщениями с Bluetooth при помощи Handler, но компилятор показывал варнинг:
This Handler class should be static or leaks might occur
Нашел вот такое решение: http://www.androiddesignpatterns.com/20 ... -leak.html
Но, теперь у меня error'ы такие (см. скриншот handler.png)
Исходник такой:

Код: Выделить всё

public class ActivityAccelerometer extends Activity implements SensorEventListener  {
    
   ...
   ...
   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_accelerometer);

        ...
        ...

        mHandler.postDelayed(sRunnable, 600000);
        finish();
    }
    
    private static class MyHandler extends Handler {
        private final WeakReference<ActivityAccelerometer> mActivity;
     
        public MyHandler(ActivityAccelerometer activity) {
          mActivity = new WeakReference<ActivityAccelerometer>(activity);
        }
     
        @Override
        public void handleMessage(Message msg) {
        	ActivityAccelerometer activity = mActivity.get();
          if (activity != null) {
          	switch (msg.what) {
            case cBluetooth.BL_NOT_AVAILABLE:
               	Log.d(cBluetooth.TAG, "Bluetooth is not available. Exit");
            	Toast.makeText(getBaseContext(), "Bluetooth is not available", Toast.LENGTH_SHORT).show();
                finish();
                break;
            case cBluetooth.BL_INCORRECT_ADDRESS:
            	Log.d(cBluetooth.TAG, "Incorrect MAC address");
            	Toast.makeText(getBaseContext(), "Incorrect Bluetooth address", Toast.LENGTH_SHORT).show();
                break;
            case cBluetooth.BL_REQUEST_ENABLE:   
            	Log.d(cBluetooth.TAG, "Request Bluetooth Enable");
            	BluetoothAdapter.getDefaultAdapter();
            	Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            	startActivityForResult(enableBtIntent, 1);
                break;
            case cBluetooth.BL_SOCKET_FAILED:
            	Toast.makeText(getBaseContext(), "Socket failed", Toast.LENGTH_SHORT).show();
                finish();
                break;
            }
          }
        }
      }
     
      private final MyHandler mHandler = new MyHandler(this);
     
      // Instances of anonymous classes do not hold an implicit
      // reference to their outer class when they are "static".
      private final static Runnable sRunnable = new Runnable() {
          public void run() { }
      };

В общем ругается на строчки взаимодействия с активити startActivityForResult и Toast.
Вложения
handler.png
handler.png (30.31 КБ) 3371 просмотр

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Проблема с Handler и Activity

Сообщение neoksi » 13 фев 2013, 09:48

Пример что ты дал и твой код, разные вещи, если в примере просто создается новый хендлер, то ты создаешь отдельный класс.

Поставь перед подчеркнутыми методами activity.
Тобишь, вместо finish(); сделай activity.finish();.

tolik777
Сообщения: 37
Зарегистрирован: 06 июл 2012, 14:25

Re: Проблема с Handler и Activity

Сообщение tolik777 » 13 фев 2013, 12:02

Большое спасибо! Как все просо оказалось! А я туда mActivity вставлял и ActivityAccelerometer, оказывается надо было просто activity
Все теперь работает, еще раз спасибо!

Ответить