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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Программирование Android Не могу установить Android Studio http://www.cyberforum.ru/android-dev/thread1374132.html
Я использую Ubuntu 14.04 LTS. Мой JDK версии 1.8.0_31. Я скачал архив Android Studio, распаковал его и запустил файл studio.sh. Но каждый раз, когда начинается установка, происходит следующая...
Программирование Android Считывание записанных данных из SQLite Помогите пожалуйста,столкнулся вот с такой проблемой.У меня есть программа написанная под Андрой,в ней 3 основных класса.1-ый Это класс DBHelper где я создаю мою БД и таблицу "regtable" с... http://www.cyberforum.ru/android-dev/thread1373853.html
Почему вызывается onDismiss Программирование Android
Привет. У меня есть DialogFragment, который вызывается в главной активности. Когда я меняю ориентацию экрана (диалог открыт), мне нужно обновить поток, но почему диалог в конце вызывает onDismiss?
Программирование Android Онлайн воспроизведение Android_Player в Android studio
Ребят! Помогите пожалуйста! Не могу сделать воспроизведение музыки онлайн( уже все перепробовала.. в приложении выводится текст сначала,а потом снизу две кнопки, Play и stop. после прочтения текста...
Программирование Android Как загружать/хранить файл в SQLite? http://www.cyberforum.ru/android-dev/thread1373759.html
Есть список, нужно по клику на айтеме открывать текстовый файл или картинку, и вопрос стоит в том как их доблять к определенному айтему с сохранением в SQLite (ну т.е. добавил файл и когда надо...
Программирование Android Как правильно сверстать в android Мне нужно что-нибудь(курсы, видео уроки, книги, статьи). Как правильно создать макет в фотошопе и сверстать его в android подробнее

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

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

13.02.2015, 14:08. Просмотров 513. Ответов 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();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru