Я нахожу эту проблему очень интересной, некоторые могут не понравиться. Будем надеяться, что получу твердый ответ.Служба 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. Если вы прочтете это, спасибо за ваше время!
Ну я прочитал до конца .. К сожалению не догадывается, почему его не освежающий! Что происходит на Nexus 7, когда диалог не отклоняется, но вы поворачиваете планшет - он сортируется при повороте? –
@MarkKeen Я добавил строку в манифест, которая предотвращает уничтожение активности при изменениях конфигурации, потому что снова на Nexus 7 она создавала несколько потоков с одной и той же службой. Несколько вызовов на сервер, оба из которых были широковещательными, и ни один из них не заполнял просмотр ресайклеров. Мне еще нужно попытаться удалить эту строку из манифеста, так как добавление элементов управления в bind() и подключении к службе(). Я попробую, как только вернусь на компьютер. – this
@MarkKeen Я могу подтвердить, что элементы управления эффективно предотвращают создание нескольких экземпляров службы. Не могу сказать то же самое о фрагменте. [logcat] (http://imgur.com/hk3V9cG) о том, что происходит, когда я поворачиваю устройство несколько раз. Это на моем телефоне, где информация обновляется и отображается независимо от беспорядка. Я займусь этим. В любом случае проблема с Nexus 7 сохраняется после нескольких часов работы в Интернете. – this