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

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

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

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

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

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

Ошибка "Unknown method "e" of "org.apache.commons.logging.Log"
Unknown method 'e' of 'org.apache.commons.logging.Log' package...

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

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

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

8
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
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
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
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
Модератор
3231 / 2034 / 319
Регистрация: 13.01.2012
Сообщений: 7,885
02.08.2016, 23:53 #5
REALIST07, что мешает прямо из потока известить BroadcastReceiver активити?
1
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
03.08.2016, 00:22 #6
Цитата Сообщение от REALIST07 Посмотреть сообщение
Таким классом является сервис, работающий в отдельном потоке
Помарочка. Сервис работает в том же потоке, откуда его вызвали, т.е. в UI. На собеседовании иногда спрашивают, если сами знают ответ.
Я тоже делал по вашему способу (через Handler). Но раз уж вы добавили BroadcastReceiver, зачем вам Handler (присоединяюсь к вопросу vxg)?
1
REALIST07
Автор FAQ
Автор FAQ
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
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
181 / 181 / 20
Регистрация: 11.06.2010
Сообщений: 949
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
Привет! Вот еще темы с решениями:

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

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

Выбор платформы разработки "1С Мобильная платформа" или "Android Studio"
Всем, здравствуйте! Есть задача по разработке клиента для терминала сбора...

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


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

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

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