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

Вызов диалога с ожиданием реакции - мьютекс лочит UI поток - Android

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Android Считывание записанных данных из SQLite http://www.cyberforum.ru/android-dev/thread1373853.html
Помогите пожалуйста,столкнулся вот с такой проблемой.У меня есть программа написанная под Андрой,в ней 3 основных класса.1-ый Это класс DBHelper где я создаю мою БД и таблицу "regtable" с определёнными полями.Этот класс приведён ниже. class DBHelper extends SQLiteOpenHelper { public DBHelper(Context context) { // конструктор суперкласса super(context, "myDB", null, 1); ...
Android Почему вызывается onDismiss Привет. У меня есть DialogFragment, который вызывается в главной активности. Когда я меняю ориентацию экрана (диалог открыт), мне нужно обновить поток, но почему диалог в конце вызывает onDismiss? http://www.cyberforum.ru/android-dev/thread1373789.html
Android Онлайн воспроизведение Android_Player в Android studio
Ребят! Помогите пожалуйста! Не могу сделать воспроизведение музыки онлайн( уже все перепробовала.. в приложении выводится текст сначала,а потом снизу две кнопки, Play и stop. после прочтения текста можно будет прослушать этот текст онлайн. но у меня не воспроизводит(( Ребят помогите пожалуйста. очень нужно:( import android.media.AudioManager; import android.os.Bundle; ...
Как загружать/хранить файл в SQLite? Android
Есть список, нужно по клику на айтеме открывать текстовый файл или картинку, и вопрос стоит в том как их доблять к определенному айтему с сохранением в SQLite (ну т.е. добавил файл и когда надо открыл), ну или как это вообще делается? 1. какой принцип? 2. какой примерно код должен быть на кнопке выбора файла? 3. как этот файл или его путь должен и сохраняться в sqlite или ресурсах? ...
Android Как правильно сверстать в android http://www.cyberforum.ru/android-dev/thread1373698.html
Мне нужно что-нибудь(курсы, видео уроки, книги, статьи). Как правильно создать макет в фотошопе и сверстать его в android
Android Работа с данными Android приложение Я создаю приложение по исторической тематике . И появилась проблема . Я создал активити с тремя кнопками : Основные события ,даты ,интересное . И мне надо сделать так что бы при нажатии на эти кнопки на этом же акстивити выводился текст , картинки и может кнопки . Как это сделать ? Вариант с DialogFragment не рассматривается . Я думаю что с помощью Базы данных ,но в интернете не нашел... подробнее

Показать сообщение отдельно
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 121

Вызов диалога с ожиданием реакции - мьютекс лочит UI поток - Android

13.02.2015, 14:08. Просмотров 412. Ответов 5
Метки (Все метки)

Необходимо решить классическую задачу - вызвать диалог, дождаться действия пользователя и на их основе сделать что-то. Естественно нужно это все сделать выполнив останов главного потока не затронув UI поток. Решение взял такое. Из активности вызывается функция вспомогательного класса, который сформировав первый асинхронный поток, вызывает из другого класса конструктор диалога который в свою очередь запускается как ответвление UI потока, первый поток блокируется мьютексом и и ждет реакции от диалога. При этом по логике UI поток должен быть свободен. Но получается так, что по непонятным мне причинам мьютекс лочит как раз его, программа виснет впав в бесконечное ожидание.

MainActivity
Java
1
2
DialogGrouper dialogConstructor = new DialogGrouper(this, MainActivity.this);
Boolean result = dialogConstructor.createDeleteDialog();
DialogGrouper
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
public Boolean createDeleteDialog() {
        class DialogTask extends AsyncTask<Void, Void, Boolean> {
            boolean response;
 
            @Override
            protected Boolean doInBackground(Void... params) {
                mainActivity.runOnUiThread(new Runnable() {                
                    public void run() {
                        deleteDialog.show();
                    }
                });
 
                try {
                    deleteDialog.waitForResponse();            
                    response = deleteDialog.getResult();
                } catch (InterruptedException e) {
                    //response
                }
 
                return response;
            }
        }
 
        DialogTask dialog = new DialogTask();
        dialog.execute();
 
        try {
            return dialog.get();
        } catch (InterruptedException e) {
            return false;
        } catch (ExecutionException e){ return false; }
 
    }
DeleteDialog
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
public class DeleteDialog {
    private AlertDialog.Builder builder;
    private Mutex mMutex;
    private boolean mResult;
 
    public DeleteDialog(Context context) {
        mMutex = new Mutex();
        builder = new AlertDialog.Builder(context);
        mResult = false;
 
        builder.setTitle(R.string.dialog_TitleDelete);
        builder.setCancelable(true);
 
        builder.setPositiveButton(R.string.dialog_yes, new DialogInterface.OnClickListener() {
 
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mResult = true;
                mMutex.unlock();
            }
        });
        builder.setNegativeButton(R.string.dialog_no, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                mResult = false;
                mMutex.unlock();
                dialog.cancel();
            }
        });
 
 
    }
 
    public void show() {
        builder.show();
    }
 
    public boolean getResult() {
        return mResult;
    }
 
    public void waitForResponse() throws InterruptedException {    
        mMutex.lock();
    }
}
Mutex
Java
1
2
3
4
5
6
7
8
public class Mutex {
    public synchronized void lock() throws InterruptedException {
        this.wait();
    }
    public synchronized void unlock() {
        this.notify();
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 10:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru