передача данных из потока Android в действие, которое не создавало поток

#android #multithreading #thread-safety

#Android #многопоточность #безопасность потоков

Вопрос:

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

Что я должен делать? Google? Это поднимает вопрос о передаче работы в фоновом режиме, чтобы не блокировать основной поток пользовательского интерфейса. Это не то, чего я хочу. Я хочу передать / отправить данные в новое текущее действие.

Ответ №1:

Обычно, если вы выполняете фоновый поток такого рода, вы хотите использовать службу для хранения потока. В вашем действии вы просто привязываетесь к сервису, и когда вы получаете экземпляр сервиса, вы можете передать ему обработчик. Поток в службе может затем получить доступ к обработчику и отправлять сообщения через обработчик в действие. Когда действие завершится unbind() , очистите обработчик и его, как будто вас там никогда не было.

Комментарии:

1. @Femi, Ну, если ты не хочешь объяснять дальше, я полагаю, ты дал мне кое-что посмотреть: «использовать службу для хранения потока?», «в вашем действии вы просто привязываетесь к службе?», «Экземпляр службы?», «передать ему обработчик», «поток в службе?», «получить доступ к обработчику?», «отправлять сообщения через обработчик в действие?», «когда действие завершится, вы отключите привязку()?», «очистить куратор?»

2. Что такого несовершенного @ Femi в фоновом потоке, которому для выполнения своей работы требуется все это прочее?

3. Дело не столько в том, что недостаточно одного фонового потока, но вам нужен какой-то дескриптор для потока для будущих ссылок. В целом это рекомендуемый способ обработки фоновых потоков на Android. Смотрите developer.android.com/guide/topics/fundamentals/services.html для более подробной информации.

4. @Femi Я только что отметил этот вопрос для получения помощи от модератора. В принципе, я задал этот вопрос преждевременно. У меня не было никакого кода. Все, что у меня было, — это словесный сценарий проблемы, которую я хотел решить. Но теперь у меня есть рабочий код: сервис, поток, обработчик и т.д. Это сделано не полностью. Мне нужна помощь. Теперь, когда у меня есть код, я могу задавать очень конкретные вопросы, в которых возникают трудности. Как вы думаете, было бы нормально опубликовать совершенно новый вопрос на основе кода, который у меня есть сейчас? Или я должен существенно пересмотреть этот вопрос и надеяться на дополнительные ответы?

5. Ах, не уверен: вы могли бы опубликовать дополнительные вопросы. Честно говоря, не уверен, каким был бы наилучший подход.

Ответ №2:

Хорошо, итак, этот поток «протоколирования» работает сам по себе, загружая входные данные в какой-либо файл на диске или что-то еще. Если какой-либо другой поток хочет «подключить» эти данные, он должен дать сигнал потоку ведения журнала вызвать что-то еще с данными, а также записать их в журнал. Поток ведения журнала обычно ожидает в некоторой очереди ввода данных для регистрации, да? Если это так, отправьте потоку сообщение в его входной очереди, чтобы сообщить ему вызвать метод XXXX со всеми данными, которые должны быть зарегистрированы. Поток ведения журнала может сохранять список всех событий, вызываемых при каждом действии ведения журнала.

Имеет ли это смысл? По сути, это расширение того, что предлагает Мари. Поток регистратора будет получать сообщения и включать в сообщении какое-либо поле перечисления ‘Ecommand’. Псевдо-Паскаль:

обращение в Message.command к : ElogString:logThis(InMessage.logString); EaddNotification:notifierList.add(InMessage.event); EdeleteNotification:notifierList.delete(InMessage.event); завершение;

Функция ‘logThis’ записала бы строку журнала в файл на диске, а затем вызывала бы каждое событие в notifierList с данными.

Имеет ли это смысл? Это произошло, когда я это писал, но сегодня вечером было на Abbot ale (5%).

Rgds, Мартин

Комментарии:

1. Я только что отметил этот вопрос для получения помощи от модератора. В принципе, я задал этот вопрос преждевременно. У меня не было никакого кода. Все, что у меня было, — это словесный сценарий проблемы, которую я хотел решить. Но теперь у меня есть рабочий код: сервис, поток, обработчик и т.д. Это сделано не полностью. Мне нужна помощь. Теперь, когда у меня есть код, я могу задавать очень конкретные вопросы, в которых возникают трудности. Как вы думаете, было бы нормально опубликовать совершенно новый вопрос на основе кода, который у меня есть сейчас? Или я должен существенно пересмотреть этот вопрос и надеяться на дополнительные ответы?

Ответ №3:

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

 final Handler someHandler=new Handler(){
public void handleMessage(Message msg)
{    switch(msg.what){
        case 0: dosomething(); break;
        case 1: dosomething(); break;
        case 2: dosomething(); break;
     }
}
  

объявите этот обработчик так же, как вы объявляете любой метод, не вкладывайте его ни в один метод
каждый раз, когда вам нужно передать некоторые данные в основное действие или графический интерфейс, простой вызов обработчика, например :

 public void downLoadData(Handler h)
{
    h.sendEmptyMessage(34);
    someThread=new threadClass(h);
}
  

и так далее…

надеюсь, это поможет, с наилучшими пожеланиями.

Комментарии:

1. и @frieza я только что отметил этот вопрос для получения помощи от модератора. В принципе, я задал этот вопрос преждевременно. У меня не было никакого кода. Все, что у меня было, — это словесный сценарий проблемы, которую я хотел решить. Но теперь у меня есть рабочий код: сервис, поток, обработчик и т.д. Это сделано не полностью. Мне нужна помощь. Теперь, когда у меня есть код, я могу задавать очень конкретные вопросы, в которых возникают трудности. Как вы думаете, было бы нормально опубликовать совершенно новый вопрос на основе кода, который у меня есть сейчас? Или я должен существенно пересмотреть этот вопрос и надеяться на дополнительные ответы?