Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 115
1

Класс ждет действия и "дарит" данные активности

02.08.2016, 20:46. Просмотров 780. Ответов 8
Метки нет (Все метки)

Вот сижу и думаю:
А реально сделать класс, который будет работать в отдельном потоке. Он постоянно проверяет что то (while (true)) и если действие происходит, то оно сообщает активити о действии. Тут все понятно. Но есть одно но, а что если мы запустили этот класс и стартанули другое активити, не завершая этого. Так вот, будет ли этот класс работать в это время? Крашнется ли все это? Или заработает все отлично и все будет обновляться и когда мы перейдем на тот класс снова, кнопкой назад, и тут будет все прекраснос обновленным листвью и т.д.?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2016, 20:46
Ответы с готовыми решениями:

Рестарт активности по нажатию на кнопку "home"
Всем привет! У меня возникла такая проблема, запускаешь приложение, затем нажимаешь на кнопку...

Работа с БД, связывание таблиц "фильмы", "жанры", "режиссеры"
Ребят, всем привет! накидайте какие-нить идеи по реализации ситуация такая есть таблицы -...

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log"
Unknown method 'e' of 'org.apache.commons.logging.Log' package com.mycompany.myapp; import...

Кнопка "Стереть данные", как от нее защититься?
В настройках приложения есть кнопка "Стереть данные", она удаляет все данные (в том числе и sql)...

Как сохранить данные при свертывании аппаратной кнопкой "Back"?
Здравствуйте. Подскажите пожалуйста, как сохранить данные при нажатии аппаратной кнопки back в...

8
REALIST07
Автор FAQ
Автор FAQ
195 / 194 / 21
Регистрация: 11.06.2010
Сообщений: 1,016
02.08.2016, 20:49 2
Таким классом является сервис, работающий в отдельном потоке, межпоточное взаимодействие организуется с помощью Handlera, у меня есть где-то пример, если он вам нужен
1
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 115
02.08.2016, 21:17  [ТС] 3
REALIST07, благодарю) ну если это вам не трудно)
0
REALIST07
Автор FAQ
Автор FAQ
195 / 194 / 21
Регистрация: 11.06.2010
Сообщений: 1,016
02.08.2016, 23:20 4
Лучший ответ Сообщение было отмечено akyma40 как решение

Решение

Для того, чтобы грамотно обыграть то, что ты говоришь тебе нужен класс, который будет знать "все о всех", с которым будет взаимодействовать твой сервис, обычно это класс - наследник Application, создаешь класс App от Application
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
 
public class App extends Application {
    private static Context context;
    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }
 
    public static boolean sendLocalBroadcastMessage(String action,String result) {
        Intent sendIntent = new Intent(action);
        sendIntent.putExtra("Result",result);
        return LocalBroadcastManager.getInstance(context).sendBroadcast(sendIntent);
    }
}
Теперь делаешь в сервисе то, о чем я упомянул:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class XmppService extends Serviceimplements Handler.Callback{
    private static Handler mHandler;
 
    /**
     * Public methods
     */
    @Override
    public void onCreate() {
 
        HandlerThread mThread = new HandlerThread("ServiceThread",
                android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        mThread.start();
        mHandler = new Handler(mThread.getLooper(), this);
    }
 
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        int method = 0;
        if (intent != null) {
            method = intent.getIntExtra(KEY_METHOD, -1);
        }
        mHandler.sendMessage(mHandler.obtainMessage(method, intent));
 
        return START_STICKY;// START_NOT_STICKY;
    }
 
    @Override
    public boolean handleMessage(android.os.Message msg) {
        int method = msg.what;
        try {
            switch (method) {
 
                case METHOD1: {
 
                    Intent intent = (Intent) msg.obj;
                    username = intent.getStringExtra(KEY_USERNAME);
                    ...
                    App.sendLocalBroadcastMessage("Операция1",result);
                }
 
                case METHOD2: {
 
                   ...
                App.sendLocalBroadcastMessage("Операция2",result);
                    break;
                }
 
                
                default:
 
                       break;
            }
 
 
 
        return false;
 
  }
В методе
Java
1
App.sendLocalBroadcastMessage("Операция1",result);
ты возвращаешь результат в класс App
после всех действий

Теперь во всех активити ты регистрируешь прослушку и метод ,который будет вызван при передаче из сервиса:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                
            }
        },Операция1);
 
        LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
 
            }
        },Операция2);
В цикле вызывать sendLocalBroadcastMessage не получится, но ты можешь пользоваться postDelayed у Handlera

Класс App нужно прописать в манифесте у application:
Java
1
2
3
 <application
        android:name=".App"
        ...
2
vxg
Модератор
3283 / 2079 / 328
Регистрация: 13.01.2012
Сообщений: 8,078
02.08.2016, 23:53 5
REALIST07, что мешает прямо из потока известить BroadcastReceiver активити?
1
CoolMind
422 / 404 / 66
Регистрация: 06.10.2012
Сообщений: 1,734
03.08.2016, 00:22 6
Цитата Сообщение от REALIST07 Посмотреть сообщение
Таким классом является сервис, работающий в отдельном потоке
Помарочка. Сервис работает в том же потоке, откуда его вызвали, т.е. в UI. На собеседовании иногда спрашивают, если сами знают ответ.
Я тоже делал по вашему способу (через Handler). Но раз уж вы добавили BroadcastReceiver, зачем вам Handler (присоединяюсь к вопросу vxg)?
1
REALIST07
Автор FAQ
Автор FAQ
195 / 194 / 21
Регистрация: 11.06.2010
Сообщений: 1,016
03.08.2016, 01:19 7
vxg, ничего не мешает, этот кусок я взял из своего большого проекта, там вся логика(не то что прям вся) хранится в этом классе, некий "фасад, который не фасад" если вы понимаете о чем я,в App также хранятся методы обертки над БД и другими данными, и сервис очень сильно захламлен,даже учитывая что я все что мог вынес за его пределы, фишка такого подхода в том, что вы везде где есть контекст можете вызывать класс App + в классе App можно хранить статическую ссылку на контекст, том время в других элементах ее хранить не рекомендуется
CoolMind, конечно, сервис работает в том же потоке, именно поэтому в моем сервисе если вы заметили запущен новый поток и в нем происходит работа, вызов нужных методов происходит через класс обертку и выглядит примерно так:
Java
1
2
3
4
5
6
7
8
9
10
public static void setListeners(final Context context) {
        Intent intent = getServiceIntent(context);
        intent.putExtra(KEY_METHOD, METHOD_SET_LISTENERS);
        context.startService(intent);
 
    }
 
    public static Intent getServiceIntent(final Context context) {
        return new Intent(context, Service.class);
    }
2
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 115
04.08.2016, 17:16  [ТС] 8
REALIST07, Спасибо, я долго искал в интернете, может просто делал не такие запросы, но этого не вывело ознакомлюсь с Service и посмотрю ваш класс, выведу все нужное для себя, чтобы эффективнее было... Спасибо
0
REALIST07
Автор FAQ
Автор FAQ
195 / 194 / 21
Регистрация: 11.06.2010
Сообщений: 1,016
04.08.2016, 21:06 9
akyma40,

Не по теме:

этого гугл не выдаст,это основано на опыте более года дружбы с андрюхой


У вашего приложения ВСЕГДА должна быть КОНЦЕПЦИЯ и МАКЕТ, если нет чего-то из них,то в большом проекте будет туго, придется его переписывать часто, а кому кайф 10к кода переписывать?
Еще есть пару замечаний:
1) В этом классе можно хранить экземпляры объектов таких как БД, нотификации и т.д., но помните о том, что это как и сервис часть приложения, а значит он работает в основном потоке;
2) Для "тяжелых и долгих" операций используется всегда сервис, или хотя бы класс отдельный;
3) Для объектов БД и нотификаций лучше всего использовать паттерн Singleton, шаблон которого вы можете добавить из студии

Добавлено через 4 минуты
Забыл еще кое-что, как получить этот класс в активити:
Java
1
2
3
4
5
    private App app;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
     app = (App) getApplication();
1
04.08.2016, 21:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2016, 21:06

Приложение "Рецепты", как хранить данные?
Есть такой вордовский файл с рецептами. Голубцы с картофелем - картофель - 4-5 шт. - капуста - 1...

Как "расшифровать" данные файлы?
Я взял готовые спрайты с одной игры! Я же не знаю, как их открыть/изменить Так-же они помечены,...

Постепенно вывести на экран слово "Java", в котором буквы состоят из "интересных" элементов
Я учусь в универе и вот пытаюсь делать лабораторные по языку java, только на свой телефон с помощью...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru