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

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

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

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

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

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

Рестарт активности по нажатию на кнопку "home" Android
Android virtual device. При нажатии на "Ок" ничего не происходит Android
Приложение "Рецепты", как хранить данные? Android
Android Осуществить парсинг JSON с помощью готового макета "VKApiMessage"
Что за класс "R"? Android
Как сохранить данные при свертывании аппаратной кнопкой "Back"? Android
Android Как поместить surfaceview или glsurfaceview на "пол" экрана
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 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
174 / 174 / 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
Модератор
3021 / 1823 / 189
Регистрация: 13.01.2012
Сообщений: 6,910
02.08.2016, 23:53     Класс ждет действия и "дарит" данные активности #5
REALIST07, что мешает прямо из потока известить BroadcastReceiver активити?
CoolMind
418 / 401 / 65
Регистрация: 06.10.2012
Сообщений: 1,723
03.08.2016, 00:22     Класс ждет действия и "дарит" данные активности #6
Цитата Сообщение от REALIST07 Посмотреть сообщение
Таким классом является сервис, работающий в отдельном потоке
Помарочка. Сервис работает в том же потоке, откуда его вызвали, т.е. в UI. На собеседовании иногда спрашивают, если сами знают ответ.
Я тоже делал по вашему способу (через Handler). Но раз уж вы добавили BroadcastReceiver, зачем вам Handler (присоединяюсь к вопросу vxg)?
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 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 "Attempt to re-open an already-closed object" при работе с SQLite
SQLite, ошибка: не существует поля "почта" в базе данных Android
При компиляции вылазит ошибка Installation error: "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE" Android
Данные не передаются из одной активности в другую Android
Android UnknownHostException: Unable to resolve host "api.openweathermap.org"

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

Или воспользуйтесь поиском по форуму:
REALIST07
Автор FAQ
Автор FAQ
174 / 174 / 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     Класс ждет действия и "дарит" данные активности
Ответ Создать тему
Опции темы

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