Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Остановка выполнения RxJava

В процессе изучения RxJava + Retrofit уперся с вопросом как правильно завершить выполнение RxJava?

Что необходимо сделать:
  1. Если человек нажал на авторизацию 2 раза подряд с какой то задержкой, у него ранее запущенный поток должен завершиться и создаться новый(т.е. ответ от сервера должен прийти только на последний запрос).
  2. При выполнении deattach необходимо завершить все запросы и перестать их слушать.

Мой код презентера(после добавления disposable.dispose() в метод Authorization перестал работать) :
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
59
60
61
62
63
64
65
66
67
68
69
70
public class LoginPresenter {
    private ILoginView iLoginView;
    private final CompositeDisposable disposable = new CompositeDisposable();
 
    public void attah(ILoginView iLoginView){
        this.iLoginView = iLoginView;
    }
 
    public void deattach(){
        iLoginView = null;
        disposable.dispose();
    }
 
    public void Authorization(String login, String password){
        disposable.dispose();
        disposable.clear();
        
        
        Observable loginObservable = ApiClient.getInstance().getiApi().login("auth", login, password);
        DisposableObserver observer = new DisposableObserver<Response<User>>() {
            @Override
            public void onNext(Response<User> response) {
                if (response != null) {
                    if (response.isSuccessful()) {
                        if (response.body().getCode() == 0) {
                            if (response.headers() != null) {
                                List<String> cookies = response.headers().values("Set-Cookie");
                                if (cookies != null) {
                                    AuthData authData = new AuthData();
                                    authData.fromCookies(cookies);
                                    if (authData.getSessionId() != null) {
                                        AuthData.saveAuthData(ThisApplication.getAppContext(), authData);
                                    }
                                    if (iLoginView != null) {
                                        iLoginView.authSuccess(response.body());
                                    }
                                }
                            }
                        } else {
                            if (iLoginView != null) {
                                iLoginView.authError(response.body().getCode());
                            }
                        }
                    }
                }
            }
 
            @Override
            public void onError(Throwable e) {
                if (iLoginView != null){
                    iLoginView.authError(e.toString());
                }
            }
 
            @Override
            public void onComplete() {
            }
        };
 
        loginObservable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(d->iLoginView.showLoadingView())
                .doFinally(iLoginView::hideLoadingView)
                .subscribeWith(observer);
        
        disposable.add(observer);
 
    }
}
Ответ:
Сообщение от Hank
Почему должен завершиться текущий запрос?
Возможно я выразился не в реактивном стиле.
Нужно отменить выполнение предыдущего запроса т.к. он уже не актуален(неактуальные параметры запроса например)
Вопрос: RxJava вернуть данные назад

Создал метод
Java
1
generatePlayer(String, String, ApiService)
в нем использую запросы, а так же метод
Java
1
Clan_DannieRx(player.getPersonaly_dannie().getClan_id(), application_id, api);
вызывает еще несколько асинхронных запросов, если условие истинно.
Тут всё работает, все запросы работают правильно. Возник вопрос, после того как все выполнилось, вернуть мне данные назад.
Java
1
generatePlayer(String, String, ApiService)
стоит пока с типом возврата
Java
1
void
, но хочу сделать чтоб пользовательский тип данных возвращал.

То есть в другом месте я мог сделать вот так
Java
1
Person = generatePlayer("name", "2323", api);
Вот что у меня есть.



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
 public void generatePlayer(final String account_id, final String application_id, final ApiService api)
        {
            final GenerateDannie generateDannie = new GenerateDannie();
            final String[] response = new String[1];
            clan_dannie = new Clan_Dannie();
    
            ApiService apiMod = RetroClient.getApiServiceMod();
            final HashMap<String, String> hashMap = new HashMap<>();
    
            //Генерирует персональные данные
            Flowable<Response<ResponseBody>> FlowablePersonallyDanie = api.getPersonallyDannie(account_id, application_id)
                    .mergeWith(api.getInfoTexnika(application_id))  
                    .mergeWith(api.getTexnikaPlayer(account_id, application_id))
                    .mergeWith(api.getStatistikaTexnika(account_id, application_id))    
                    .mergeWith(api.getDostizenie(application_id))   //Достижения
                    .mergeWith(api.getDostizeniePlayer(account_id, application_id))  
                    .mergeWith(api.getDostizenieTexnika(account_id, application_id)) 
                    .mergeWith(apiMod.getModWin8()); 
    
            FlowablePersonallyDanie
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new FlowableSubscriber<Response<ResponseBody>>() {
                        @Override
                        public void onSubscribe(Subscription s) {
                            s.request(Long.MAX_VALUE);
                        }
                        @Override
                        public void onNext(Response<ResponseBody> responseBodyResponse) {
                            //Прилетел ответ
                            try {
                                String url =String.valueOf(responseBodyResponse.raw().request().url());
                                String response = responseBodyResponse.body().string();
                                Log.e("URL", url);
                                Log.e("TAG", response);
                                hashMap.put(url, response);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        @Override
                        public void onError(Throwable t) {
                            //Ошибка
                        }
    
                        @Override
                        public void onComplete() {
                            //В случае выполнения
                            generatePlayerDannie(hashMap, account_id);
                           if(!player.getPersonaly_dannie().getClan_id().isEmpty())
                               Clan_DannieRx(player.getPersonaly_dannie().getClan_id(), application_id, api);
                           // player.setClan_dannie(clan_dannie);
                        }
                    });
}
Ответ: Да сейчас посмотрю. Да вы правы у меня синхронное приложение. Просто у меня есть кнопка, которая обновляет данные с сервера. И я сделал асинхронные запросы, для того чтоб выполнить запросы параллельно, чтоб уменьшить время обновления данных. А пока эти данные обновляются, у меня выводит ProgressDialog, показывая пользователю что идет обновления. Больше мне ненужна асинхронность
Вопрос: Не могу заставить работать Retrofit + RxJava

Не могу заставит работать Retrofit + RxJava.
Кто может помочь?
Без RxJava всё работает.
Лямбды никак не могу подключить, поэтому лучше без них.
Готов заплатить за консультацию, уже всю Сеть облазил.
Нужен просто рабочий кусок кода для копипаста, чтобы разобраться.
Как правильно подписаться на события и выполнить свой код в onNext, onError и т.д. ?
Ответ: demixdn - спасибо бро, ты лучший!
Теперь всё работает.
И это в тот момент, когда я уже решил, что обречен на вечное использование Асинктасков
Вопрос: Остановка анимации

Здравствуйте, мне нужно запрограммировать кнопку(button1) на остановку анимации. Пока получился только старт анимации.
Код Java(TM) 2 Platform Standard Edition 5.0
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
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageView;
import android.graphics.drawable.AnimationDrawable;
import android.view.View.OnClickListener;
 
 
public class MainActivity extends Activity {
 
    public ImageView train;
    private Button start;
    private Button stop;
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
    }
    public void start(View v){
        train = (ImageView)findViewById(R.id.train);
        Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
        final Button start = (Button) findViewById(R.id.button);
        train.startAnimation(anim);
 
    }
 
 
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
     
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       
        int id = item.getItemId();
 
  
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
}
Ответ:
Сообщение от SergeiVasech
Здравствуйте, мне нужно запрограммировать кнопку(button1) на остановку анимации.
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
final Button stop = (Button)findViewById(R.id.bStop);
stop.setOnClickListener(new OnClickListener() {
@Override
public void onClick(final View v) {
train.clearAnimation();
}
});
Писал не в студии, поэтому могут быть ошибки

Добавлено через 1 минуту
На новых версиях Android, вроде, еще так можно:
Код Java(TM) 2 Platform Standard Edition 5.0
1
train.animate().cancel();
Вопрос: Выполнение действия по таймеру

Здравствуйте. Подскажет пожалуйста, каким образом можно решить следующую задачу: Необходимо при при выполнении некоего условия запускать таймер. Затем, когда таймер достигнет определенного времени, еще раз проверить выполнение того же условия. В случае, если условие по-прежнему выполняется, производится некое действие, например, воспроизводится звуковой сигнал. Если же условие не выполняется, таймер останавливается и сбрасывается, а действие не выполняется.
Ответ:
Сообщение от Sanya94
Подскажет пожалуйста, каким образом можно решить следующую задачу
задача решается очень просто
при при выполнении некоего условия надо запускать таймер
затем, когда таймер достигнет определенного времени, еще раз проверить выполнение того же условия
в случае, если условие по-прежнему выполняется - производится некое действие, например, воспроизводится звуковой сигнал
Вопрос: Как отследить принудительную остановку service системой?

Как отследить остановку service когда Android его останавливает из- за нехватки ресурсов и т.п., ... Нужно выводить диалог для его повторного включения?

Добавлено через 18 часов 45 минут
ну или, чтоб приложение никогда не завершалось (в режиме сна может остановиться, а может нет), что с этим делают, надо чтоб оно постоянно работало в любых режимах питания и т.п.?
Ответ: Может такое поможет


При выключении экрана запускайте сервис, при включении хз, еще раз запускайте. Или что то делайте, в общем это евент через который можно отследить включение и выключение экрана девайса.
Вопрос: Как сделать задержку выполнения программы на 3 сек

Очень простой вопрос, но ответа не могу найти!
Как я понял, что бы сделать задержку выполнения программы, необходимо в тексте написать Thread.sleep(3000);, соответственно студия выдает ошибку, но ничего не предлагает сделать! Вопрос что надо сделать чтоб это заработало, импортировать библиотеку или имплементится? чтооо?
Ответ: Ну вообще-то да такое он предлагал ), спасибо за ответ!
Вопрос: Остановка / воспроизведение аудио

выручайте) в общем, есть всего одна кнопка, которая останавливает и воспроизводит изначально запущенное аудио. почему она только останавливает, а при повторном нажатии ничего не меняется?

Код Java(TM) 2 Platform Standard Edition 5.0
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
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fourth);
        mySound = MediaPlayer.create(this, R.raw.firstepisodes);
        mySound.start();
        mySound.isPlaying();
        //play = true;
 
    }
 
public void playMusic(View view) {
        if(mySound.isPlaying()){
            mySound.stop();
        }
        else {
            mySound.start();
        }
 
        /*if (play = true){
            mySound.stop();
            play = false;
        }
        if (play = false){
            mySound.start();
            play = true;
        }*/
    }
Добавлено через 3 часа 30 минут
можно вновь воспроизвести, только когда пройдет время длительности композиции. то есть, если я ее выключил, то не смогу включить, пока не пройдет ее время. такое ощущение, что выключается только звук, а медодия продолжает играть, но беззвучно.
Ответ: по моему из-за потоков, каждая музычка включается в отдельном потоке, я как то умудрился так несколько раз запустить одну и туже музыку
Вопрос: Не работает остановка потока!

Помогите пожалуйста! Укажите на ошибку! Почему не останавливается поток????
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
public class FoneService extends Service {
    // ИМЯ СЕРВЕРА (url зарегистрированного нами сайта)
    // например [url]http://l29340eb.bget.ru[/url]
 
 
    String server_name = "http://46.59.45.14/gates";    
 
    HttpURLConnection conn;
    Thread thr;
    String my_var, id_visova, nom_tel, flag_lgota,  cod_car;
 
//    Integer id_visova;
 
 
 
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
 
 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void onStart(Intent intent, int startId) {
 
        Log.i("chat", "+ FoneService - запуск сервиса");
 
        // создадим и покажем notification
        // это позволит стать сервису "бессмертным"
        // и будет визуально видно в трее
//        Intent iN = new Intent(getApplicationContext(), MainActivity.class);
        Intent iN = new Intent();
        cod_car = intent.getStringExtra("cod_car");
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
                | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pI = PendingIntent.getActivity(getApplicationContext(),
                0, iN, PendingIntent.FLAG_CANCEL_CURRENT);
        Notification.Builder bI = new Notification.Builder(
                getApplicationContext());
        bI.setContentIntent(pI)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setLargeIcon(BitmapFactory.decodeResource(getApplicationContext().getResources(), R.mipmap.ic_launcher))
                .setAutoCancel(true)
                .setContentTitle(getResources().getString(R.string.fon_msg))
                .setContentText("Работаю...");
        Notification notification = bI.build();
        startForeground(101, notification);
 
        startLoop();
        Log.i("chat",
                "+ FoneService --------------- после startloop " );
 
    }
    @Override
    public void     onDestroy (){
 
        thr.interrupt();
 
    }
 
 
 
    // запуск потока, внутри которого будет происходить
    // регулярное соединение с сервером для чтения новых
    // сообщений.
    // если сообщения найдены - отправим броадкаст для обновления
 
 
    private void startLoop() {
 
        thr = new Thread(new Runnable() {
 
            // ansver = ответ на запрос
            // lnk = линк с параметрами
            // my_var = моя переменная
            String ansver, lnk;
            @Override
            public void run() {
//                while (!thr.isInterrupted()) {
                while  (!Thread.currentThread().isInterrupted()) {
                    System.out.println("Привет из потока " + Thread.currentThread().getName());
//                while (true) { // стартуем бесконечный цикл
 
                    // создаем соединение ---------------------------------->
                    try {
                        lnk = server_name + "/chat.php?action=select&car="
                                + URLEncoder.encode(cod_car, "UTF-8");
                        Log.i("chat",
                                "+ FoneService --------------- ОТКРОЕМ СОЕДИНЕНИЕ "+cod_car);
 
                        conn = (HttpURLConnection) new URL(lnk)
                                .openConnection();
                        conn.setReadTimeout(10000);
                        conn.setConnectTimeout(15000);
                        conn.setRequestMethod("POST");
                        conn.setRequestProperty("User-Agent", "Mozilla/5.0");
                        conn.setDoInput(true);
                        conn.connect();
 
                    } catch (Exception e) {
                        Log.i("chat", "+ FoneService ошибка: " + e.getMessage());
                    }
                    // получаем ответ ---------------------------------->
                    try {
                        InputStream is = conn.getInputStream();
                        BufferedReader br = new BufferedReader(
                                new InputStreamReader(is, "UTF-8"));
                        StringBuilder sb = new StringBuilder();
                        String bfr_st = null;
                        while ((bfr_st = br.readLine()) != null) {
                            sb.append(bfr_st);
                        }
 
                        Log.i("chat", "+ FoneService - полный ответ сервера:\n"
                                + sb.toString());
 
                        // сформируем ответ сервера в string
                        // обрежем в полученном ответе все, что находится за "]"
                        // это необходимо, т.к. json ответ приходит с мусором
                        // и если этот мусор не убрать - будет невалидным
                        ansver = sb.toString();
                        ansver = ansver.substring(0, ansver.indexOf("]") + 1);
 
                        is.close(); // закроем поток
                        br.close(); // закроем буфер
 
                    } catch (Exception e) {
                        Log.i("chat", "+ FoneService ошибка: " + e.getMessage());
                    } finally {
                        conn.disconnect();
                        Log.i("chat",
                                "+ FoneService --------------- ЗАКРОЕМ СОЕДИНЕНИЕ");
                    }
 
                    // запишем ответ  ---------------------------------->
                    if (ansver != null && !ansver.trim().equals("")) {
 
                        Log.i("chat",
                                "+ FoneService ---------- ответ содержит JSON:");
 
                        try {
                            // ответ превратим в JSON массив
                            JSONArray ja = new JSONArray(ansver);
                            JSONObject jo;
 
                            Integer i = 0;
 
                            while (i < ja.length()) {
 
                                // разберем JSON массив построчно
                                jo = ja.getJSONObject(i);
 
                                // создадим новое сообщение
 
                                my_var =  jo.getString("np_pod").trim()+" "+jo.getString("ulisa_pod").trim()+" "+
                                        jo.getString("dom_pod").trim()+" "+jo.getString("korp_pod").trim();
                                id_visova = jo.getString("id");
                                nom_tel = jo.getString("tel_client");
                                flag_lgota = jo.getString ("lgota");
 
 
 
                                i++;
 
                                // отправим броадкаст для ChatActivity
                                // если она открыта - она обновить ListView
                                Intent intent2 = new Intent("com.example.papa.action.UPDATE_ListView");
                                intent2.putExtra("dannie_visova",my_var);
                                intent2.putExtra("id_visova",id_visova);
                                intent2.putExtra("telefon",nom_tel);
                                intent2.putExtra("lgota",flag_lgota);
                                sendBroadcast(intent2);
 
 
                            }
                        } catch (Exception e) {
                            // если ответ сервера не содержит валидный JSON
                            Log.i("chat",
                                    "+ FoneService ---------- ошибка ответа сервера:\n"
                                            + e.getMessage());
                        }
                    } else {
                        // если ответ сервера пустой
                        Log.i("chat",
                                "+ FoneService ---------- ответ не содержит JSON!");
                    }
 
                    try {
                        Log.i("chat",
                                "+ ==================== пауза ===================");
                        Thread.sleep(15000);
                    } catch (Exception e) {
                        Log.i("chat",
                                "+ FoneService - ошибка процесса(перед return): "
                                        + e.getMessage());
                        return;
 
                    }
                }
            }
        });
 
        thr.setDaemon(true);
        thr.start();

return не отрабатывается. почему???

Добавлено через 36 минут
проблема оказалась иной. судя по отладчику, потоков запускается два! как так??
Ответ: Спасибо) так и оказалось..)
Вопрос: MediaPlayer ест трафик после остановки воспроизведения

Запускаю на воспроизведение радиостанцию(Stream) при помощи MediaPlayer. Музыка играет, при нажатии на кнопку выполняется метод stop(), воспроизведение прекращается, но судя по индикатору на панели уведомлений трфик продолжает тратиться. Помогает только убийство процесса. Как завершить воспроизведение, и чтобы приложение больше ничего не подгружало?? Спасибо
Ответ: как было так и осталось))