MainActivity утекла ServiceConnection, когда onDestroy работает в Android.Как предотвратить эту ошибку? - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю приложение для Android, а основная функциональность - в классе ConnectionService, который в основном обрабатывает связь с веб-сокетом.Моя проблема в том, что если я выйду из приложения с кнопками на моем устройстве износа Android, ошибки не будет, все работает как и ожидалось в фоновом режиме.Но если я проведу влево, выйдя из приложения в меню, то приложение вылетает (насколько я знаю, в этом случае работает метод onDestroy. Поэтому я получаю следующую ошибку:

Activity com.example.adambodnar.canary.MainActivity has leaked ServiceConnection com.example.adambodnar.canary.MainActivity$4@79552f9 that was originally bound here android.app.ServiceConnectionLeaked: Activity com.example.adambodnar.canary.MainActivity has leaked ServiceConnection com.example.adambodnar.canary.MainActivity$4@79552f9 that was originally bound here

Я прочитал много вопросов по этому поводу, но не смог найти решение, соответствующее моей проблеме. Служба работает в фоновом режиме как служба переднего плана, поэтому я не хочучтобы остановить его запуск.

Вот это MainActivity.class

public class MainActivity extends FragmentActivity {

    private static ConnectionService mService;
    private boolean mBound = false;
    private final FragmentManager supportFragmentManager = getSupportFragmentManager();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        supportFragmentManager.beginTransaction().replace(R.id.fragment_container, new MainFragment()).commit();
        if(!PermissionHelper.hasPermissions(this, Constants.PERMISSIONS)){
            ActivityCompat.requestPermissions(this, Constants.PERMISSIONS, Constants.PERMISSION_ALL);
        }

        Intent intent = new Intent(this, ConnectionService.class);
        this.startService(intent);
        this.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                                       IBinder service) {
            ConnectionService.LocalBinder binder = (ConnectionService.LocalBinder) service;
            mService = binder.getServiceInstance();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

    public static void sendMessage(String message) {
        mService.sendMessage(message);
    }

    public static void rebuildWebSocketConnection() {
        mService.rebuildWebSocketConnection();
    }
}

И мой ConnectionService:

public class ConnectionService extends Service {

    private WebSocketHelper webSocketHelper = new WebSocketHelper();
    private final String TAG = "ConnectionService";
    private final IBinder mBinder = new LocalBinder();

    public class LocalBinder extends Binder {
        public ConnectionService getServiceInstance() {
            return ConnectionService.this;
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.i(TAG, "SERVICE IS BINDED");
        return mBinder;
    }

    @Override
    public void onCreate() {
        System.out.println("ON CREATE OF CONNECTION SERVICE");
        super.onCreate();
        Intent notificationIntent = new Intent(this, MainActivity.class);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);

        Notification notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("My Awesome App")
                .setContentText("Doing some work...")
                .setContentIntent(pendingIntent).build();

        startForeground(1337, notification);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "--- Connection Service onStartCommand ---");
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    public void sendMessage(String message) {
        Log.d(TAG, "WebSocketHelper is open: " + webSocketHelper.isWebSocketOpen());
        if (webSocketHelper.isWebSocketOpen()) {
            Log.i(TAG, "--- WebSocket Message: " + message + " ---");
            webSocketHelper.sendMessage(message);
        }
    }
}

Так что я должен сделать, чтобы сделать этоошибка исчезнет?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Деятельность com.example.adambodnar.canary.MainActivity утекла ServiceConnection com.example.adambodnar.canary.MainActivity$4@79552f9, который изначально был привязан здесь android.app.ServiceConnectionLeaked: Деятельность com.example.adambodnar.canary.MainActivity утекла ServiceConnection com.example.adambodnar.canary.MainActivity$4@79552f9, который был изначально привязан здесь

в основном onStop вам следует unbind служб.

@Override
    protected void onStop() {
        super.onStop();
        unbindService(mConnection);
    }
0 голосов
/ 29 ноября 2018

Вы должны поставить на метод onDestroy Службу отмены привязки:

@Override
public void onDestroy(){
    super.onDestroy();
    this.unbindService(mConnection);
}
...