2016-03-03 2 views
0

У меня изначально был Activity, который создает thread, который подключается к серверу, сам обновляет отправку обновления на сервер, который затем перенаправляет обновление на другое устройство, которое также запускает приложение. Я столкнулся с проблемой, когда вращение экрана создает другую сеть thread. Обратите внимание: я не могу просто заблокировать экран, чтобы он не вращался.Активность, на которую вы можете получить доступ к сервису

Мне было поручено создать фоновое обслуживание (в качестве альтернативы, но не обязательно, если оно может работать по-другому), который запускает сеть thread. Затем получите activity после его восстановления для повторной привязки к службе и продолжения работы как обычно.

Мой вопрос, как я могу передать контекст моего activity к thread, а также доступ к переменной внутри этого thread от моего activity? Я предполагаю, что кто-то скажет создать class внутри службы, которая запускает поток, и получить доступ к полю, которое находится внутри этого class через getter. Я совершенно новичок в обслуживании, однако я могу запустить его и запустить thread. Я просто запутался в том, как обратный вызов и направление между активностью и потоком.

EDIT Я получаю и ошибка его о том, что я не могу бросить осколок в свой класс Фрагмент

@Override 
    protected void onResume(){ 
     FragmentManager manager = getFragmentManager(); 
     myFrag = (NetworkFragment) manager.findFragmentByTag(TAG_NETWORK_FRAGMENT); // here 
     if (myFrag == null) { 
      myFrag = new NetworkFragment(); 
      manager.beginTransaction().add(myFrag, TAG_NETWORK_FRAGMENT).commit(); // and it can't resolve this... 
     } 
    } 

Фрагмент

import android.support.v4.app.Fragment;  

public class NetworkFragment extends Fragment implements Runnable { 
     //blahbalh 
} 
+0

Не передавайте информацию об услуге. На самом деле, не пропускайте никакой активности нигде, чтобы сохранить ее за пределами ее обычного жизненного цикла. В большинстве случаев также практически нет необходимости создавать свою собственную нить. Лучше использовать инструменты, предоставляемые Android, и следовать существующим шаблонам для многопоточности, как описано в документации для Android. –

ответ

0

Вместо того, чтобы использовать услугу, вы можете использовать фрагмент с помощью setRetainInstance (true) для выполнения вашего сетевого вызова. Фрагмент будет продолжать работать, если основная активность будет уничтожена из-за вращения.

В вашей деятельности в onResume вы должны проверить, находится ли фрагмент в стеке (getFragmentManager(). FindFragmentByTag()). Если это так, вы должны зарегистрировать слушателя для получения ответа на сетевой вызов. Если его нет (первый раз), вы создаете экземпляр и регистрируете своего слушателя.

В onPause вы прекратите регистрацию своего слушателя.

Фрагмент будет содержать сетевой результат до тех пор, пока действие не будет создано и не запросит ответ сети.

Для получения более подробной информации см. this.

+0

Спасибо за отличную информацию! Как отредактировать фрагмент из Activity? Я предполагаю метод onResume, который вы сохранили бы в объекте моего класса фрагментов? – chewbapoclypse

+0

Вы создаете экземпляр и присваиваете ему тег. Затем вы используете этот тег для его восстановления, как указано в моем ответе выше. Это всего лишь фрагмент, поэтому вы также добавите API, например, «getResponse», который вы вызываете из onResume, если он выполнит свою задачу. – Francesc

Смежные вопросы