Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 103
#1

Класс ждет действия и "дарит" данные активности - Программирование Android

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

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

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

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

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

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

Что за класс "R"? - Программирование Android
Начал изучать программирование под Android, с java знаком, к сожалению, очень поверхностно(буду учить по ходу дела). В созданном...

Данные не передаются из одной активности в другую - Программирование Android
Данные не передаются в другую активность... Вот код: Из: Intent inttt = new Intent(hhhhh.this, list.class); inttt.putExtra("vgh",...

Осуществить парсинг JSON с помощью готового макета "VKApiMessage" - Программирование Android
Я никак не могу осуществить парсинг JSON с помощью готового макета "VKApiMessage". Пример JSON: https://vk.com/dev/messages.getDialogs...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
02.08.2016, 20:49     Класс ждет действия и "дарит" данные активности #2
Таким классом является сервис, работающий в отдельном потоке, межпоточное взаимодействие организуется с помощью Handlera, у меня есть где-то пример, если он вам нужен
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 103
02.08.2016, 21:17  [ТС]     Класс ждет действия и "дарит" данные активности #3
REALIST07, благодарю) ну если это вам не трудно)
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
02.08.2016, 23:20     Класс ждет действия и "дарит" данные активности #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для того, чтобы грамотно обыграть то, что ты говоришь тебе нужен класс, который будет знать "все о всех", с которым будет взаимодействовать твой сервис, обычно это класс - наследник 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"
        ...
vxg
Модератор
3145 / 1947 / 214
Регистрация: 13.01.2012
Сообщений: 7,439
02.08.2016, 23:53     Класс ждет действия и "дарит" данные активности #5
REALIST07, что мешает прямо из потока известить BroadcastReceiver активити?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
03.08.2016, 00:22     Класс ждет действия и "дарит" данные активности #6
Цитата Сообщение от REALIST07 Посмотреть сообщение
Таким классом является сервис, работающий в отдельном потоке
Помарочка. Сервис работает в том же потоке, откуда его вызвали, т.е. в UI. На собеседовании иногда спрашивают, если сами знают ответ.
Я тоже делал по вашему способу (через Handler). Но раз уж вы добавили BroadcastReceiver, зачем вам Handler (присоединяюсь к вопросу vxg)?
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
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);
    }
akyma40
16 / 15 / 3
Регистрация: 20.05.2015
Сообщений: 103
04.08.2016, 17:16  [ТС]     Класс ждет действия и "дарит" данные активности #8
REALIST07, Спасибо, я долго искал в интернете, может просто делал не такие запросы, но этого не вывело ознакомлюсь с Service и посмотрю ваш класс, выведу все нужное для себя, чтобы эффективнее было... Спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2016, 21:06     Класс ждет действия и "дарит" данные активности
Еще ссылки по теме:

Услуга - "поругайте мой код" есть тут такая?) - Программирование Android
собственно сабж :) Если кому нибудь из гуру не лень посмотреть и указать на явные ошибки в коде - буду признателен

Notification вывод строки с символами перехода на новую строку "\n" - Программирование Android
Здравствуйте, пишу приложение для android 4. В нем service выводит notification в котором текст - это String c несколькими символами...

EditText и добавление символов в него через собственную "клавиатуру" - Программирование Android
Ребятушки привет! я начинающий андроид девелопер....и столкнулся с такой трудностью.. Пишу калькулятор, у меня есть EditText и 10...

Unexpected namespace prefix "map" found for tag fragment - Программирование Android
Но почему там, где map, у меня ошибки??? &lt;fragment xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; ...

"Error while reading RSS" при попытке загрузить новости - Программирование Android
Здравствуйте! При попытке загрузить новости приложение выдает ошибку error while reading RSS. Что это значит? Где исправить в коде?


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

Или воспользуйтесь поиском по форуму:
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
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();
Yandex
Объявления
04.08.2016, 21:06     Класс ждет действия и "дарит" данные активности
Ответ Создать тему
Опции темы

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