2

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

У меня есть фрагмент, который связывает службу в onResume(), чтобы автоматически обновлять данные каждые 60 секунд, пока пользователь присутствует. Мой bind() метод здесь ...

public void bind() { 
    if(connected || MainActivity.sRefresherBinding) return; 
    MainActivity.sRefresherBinding = true; 
    Log.v(LOG_TAG, "binding..."); 
    mProgressDialog.setTitle("Service Connected!"); 
    mProgressDialog.setMessage("We're almost there!"); 
    Intent bindingIntent = new Intent(getActivity(), Refresh.class); 
    getActivity().bindService(bindingIntent, mConnection, Context.BIND_AUTO_CREATE); 
    getActivity().startService(bindingIntent); 
} 

unbind() Соответствующий метод здесь названный в onStop() ...

public void unbind() { 
     Log.v(LOG_TAG, "unbinding"); 
     if (connected) { 
      mRefreshService.terminate(); 
      getActivity().unbindService(mConnection); 
      getActivity().stopService(new Intent(getActivity(), Refresh.class)); 
      connected = false; 
     } 
    } 

onServiceConnected() здесь ...

public void onServiceConnected(ComponentName name, IBinder service) { 
     if(binder != null) binder = null; 
     binder = (Refresh.LocalBinder) service; 
     if(mRefreshService != null) mRefreshService.terminate(); 
     mRefreshService = binder.getService(); 
     connected = true; 
     mProgressDialog.setTitle("Refreshing your data..."); 
     mProgressDialog.setMessage("We are almost there!"); 
     Log.v(LOG_TAG, "Service Connected"); 
    } 

Мои onStartCommand() на Refresh проходит службу

public int onStartCommand(Intent intent, int flags, int startId) { 
    start(new UpdateListener() { 
     @Override 
     public void onUpdate(ArrayList<Quote.SingleQuote> newData) { 
      Intent broadcastIntent = new Intent(); 
      broadcastIntent.setAction(Utility.BROADCAST); 
      broadcastIntent.putExtra(Utility.QUOTE_INTENT, newData); 
      sendBroadcast(broadcastIntent); 
     } 
    }); 

    if (mHandler == null) { 
     mHandler = new Handler(); 
     mHandler.post(mRunnable); 
    } 

    return Service.START_STICKY; 
} 

с выполняемым ...

private Runnable mRunnable = new Runnable() { 
    @Override 
    public void run() { 
     refreshMain(); 
     if (mHandler != null) 
      mHandler.postDelayed(this, MIN_UPDATE_TIME); 
    } 
}; 

refreshMain слишком большой, я просто опубликовать фрагмент кода, где результат отправляется обратно к слушателю ...

call.enqueue(new Callback<Quote>() { 

      @Override 
      public void onResponse(Response<Quote> response) { 
       try {       
        List<Quote.SingleQuote> asList = response.body().query.results.getQuote(); 
        mQuotes = new ArrayList<>(asList); 
        mListener.onUpdate(mQuotes); 
        Log.v(LOG_TAG, "Refreshed"); 

       } 

И, наконец My Трансляционный приемник ...

public static class UpdateReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(final Context context, final Intent intent) { 

     if(MainFragmentService.getInstance().mProgressDialog != null) MainFragmentService.getInstance().mProgressDialog.dismiss(); 
     if(MainFragmentService.getInstance() != null) { 
      MainFragmentService.getInstance().mQuotes = intent.getParcelableArrayListExtra(Utility.QUOTE_INTENT); 
      MainFragmentService.getInstance().mAdapter.swapList(MainFragmentService.getInstance().mQuotes); 
      Log.v(LOG_TAG, "Package received"); 
      MainActivity.sRefresherBinding = false; 
     } 
    } 
} 

Вот эта сложная часть. Весь этот код красиво работает на моей пятой странице 5, но когда я запускаю его на своем Nexus 7, перейдите в другое действие и вернитесь, служба зависает. Данные извлекаются, транслируются, принимаются, НО диалог не отменяется, и данные не отображаются в представлении ресайклеров.

Взгляд на LogCat на моем Nexus 5:

V/MainFragmentService: onPause 
V/MainFragmentService: unbinding 
V/MainFragmentService: onStop 
V/MainFragmentService: onResume 
V/MainFragmentService: binding... 
V/Refresh: RefreshMain called 
V/MainFragmentService: Service Connected 
V/Refresh: Refreshed 
V/MainFragmentService: Package received 

Теперь посмотрим на LogCat на моем Nexus 7:

V/MainFragmentService: onPause 
V/MainFragmentService: unbinding 
V/MainFragmentService: onStop 
V/MainFragmentService: onResume 
V/MainFragmentService: binding... 
V/MainFragmentService: onResume 
V/Refresh: RefreshMain called 
V/MainFragmentService: Service Connected 
V/Refresh: Refreshed 
V/MainFragmentService: Package received 
V/Refresh: Waiting 
V/Refresh: Waiting 
V/Refresh: RefreshMain called 
V/Refresh: Refreshed 
V/MainFragmentService: Package received 

В случае, если у вас есть сомнения по поводу этого кода работает на всех , приложение прямо здесь, go nuts. Если вы прочтете это, спасибо за ваше время!

+0

Ну я прочитал до конца .. К сожалению не догадывается, почему его не освежающий! Что происходит на Nexus 7, когда диалог не отклоняется, но вы поворачиваете планшет - он сортируется при повороте? –

+0

@MarkKeen Я добавил строку в манифест, которая предотвращает уничтожение активности при изменениях конфигурации, потому что снова на Nexus 7 она создавала несколько потоков с одной и той же службой. Несколько вызовов на сервер, оба из которых были широковещательными, и ни один из них не заполнял просмотр ресайклеров. Мне еще нужно попытаться удалить эту строку из манифеста, так как добавление элементов управления в bind() и подключении к службе(). Я попробую, как только вернусь на компьютер. – this

+0

@MarkKeen Я могу подтвердить, что элементы управления эффективно предотвращают создание нескольких экземпляров службы. Не могу сказать то же самое о фрагменте. [logcat] (http://imgur.com/hk3V9cG) о том, что происходит, когда я поворачиваю устройство несколько раз. Это на моем телефоне, где информация обновляется и отображается независимо от беспорядка. Я займусь этим. В любом случае проблема с Nexus 7 сохраняется после нескольких часов работы в Интернете. – this

ответ

1

Проблема устранена до параметров разработчика> Приложения> Не активируйте действия на Nexus 7, отключенные на Nexus 5 (и другие).

Это означает, что реальная проблема была в самой Деятельности, которая разрушалась при ее выходе из нее. При навигации назад новый Fragment создавался поверх существующего, потому что я не проверял savedInstanceState. Переполох, упомянутый выше в комментариях, теперь также исправлен, не нужно больше предотвращать разрушение активности при изменении конфигурации через манифест.

getFragmentManager().beginTransaction().add(R.id.content_main_list_container, 
new MainFragmentService(), FRAGMENT_TAG_MAIN_LIST).commit(); 

Сейчас ...

MainFragmentService mainFragment; 
     if(savedInstanceState == null) { 
      mainFragment = new MainFragmentService(); 
      getFragmentManager() 
        .beginTransaction() 
        .add(R.id.content_main_list_container, 
          mainFragment, FRAGMENT_TAG_MAIN_LIST) 
        .commit(); 
     } 
Смежные вопросы