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

Не могу найти ошибку (Потоки) - Android

Восстановить пароль Регистрация
 
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
20.02.2015, 11:44     Не могу найти ошибку (Потоки) #1
Всем привет. Вот уже неделю не могу найти ошибку в коде. Структура кода такова:

В MainActivity я вызываю IODialog:

Java
1
IODialog.getInstance().show(getSupportFragmentManager(), "");
Код IODialog:

Кликните здесь для просмотра всего текста
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
public class IODialog extends SherlockDialogFragment {
    // singleton
    private static IODialog instance;
    
    private EditText outputEdit;
    private EditText inputEdit;
    private Button   putButton;
    
    // method returns instance of this class
    public static IODialog getInstance() {
        if (instance == null) {
            instance = new IODialog();
        }
        return instance;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        //setRetainInstance(true);
    }
 
    @Override
    public void onResume() {
        super.onResume();   
        
        ESiInterpreter.getInstance().start();
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        
        getDialog().setTitle(R.string.io_dlg_title);
        View v = inflater.inflate(R.layout.io_dialog, null);
        
        // create output and input edits
        outputEdit = (EditText)v.findViewById(R.id.io_output_edit);
        inputEdit  = (EditText)v.findViewById(R.id.io_input_edit);
        
        // create put button
        putButton = (Button)v.findViewById(R.id.io_put_button);
        // set onClick to PUT button
        putButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
                setEnabledPutButton(false);
                ESiInterpreter.conditionVar.open();
                clearInput();
            }
        });
            
        return v;
    }
    
    @Override
    public void onStop() {
        super.onStop();
        
        Log.i("TAG", "onStop");
        //ESiInterpreter.getInstance().stop();
    }
    
 
    @Override
    public void onDismiss(DialogInterface dialog) {
        super.onDismiss(dialog);
        
        Log.i("TAG", "onDismiss");
        ESiInterpreter.getInstance().stop();
    }
 
    // appends output
    public void appendOutput(String out) {
        outputEdit.append(out);
    }   
    
    // returns input char
    public char getInput() {
        if (inputEdit.getText().toString().isEmpty()) {
            return '\0';
        }
        return inputEdit.getText().toString().charAt(0);
    }
    
    // clear output
    public void clearOutput() {
        outputEdit.setText("");
    }
    
    // clear input
    public void clearInput() {
        inputEdit.setText("");
    }
    
    // enable/disable put button
    public synchronized void setEnabledPutButton(boolean enabled) {
        putButton.setEnabled(enabled);
    }
}


Код ESiInterpreter:

Кликните здесь для просмотра всего текста
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
public class ESiInterpreter extends AsyncTask<Void, Character, Void> {
    // singleton
    private static ESiInterpreter instance;
    
    // wait for user input
    public static ConditionVariable conditionVar = 
            new ConditionVariable(false);
    
    // if it's true, put button will be enabled in onProgressUpdate()
    private boolean isPutButtonEnabled;
        
    public static ESiInterpreter getInstance() {
        if (instance == null) {
            instance = new ESiInterpreter();
        }
        return instance;
    }
    
    @Override
    protected Void doInBackground(Void... params) {
        // run interpreter
        Log.i("TAG", "exec");
        
        try {
            Brainfuck.interpret(Source.get());
        } catch (OutOfMemoryError e) {}
        
        return null;
    }
    
    @Override
    protected void onProgressUpdate(Character... values) {
        super.onProgressUpdate(values);
        
        IODialog.getInstance().appendOutput(values[0].toString());
        
        if (isPutButtonEnabled) {
            IODialog.getInstance().setEnabledPutButton(true);
            isPutButtonEnabled = false;
        }
    }
    
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        
        IODialog.getInstance().appendOutput("--- begin ---\n");
    }
 
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        
        IODialog.getInstance().appendOutput("\n--- end ---\n");
    }
 
    public void start() {   
        if (instance.getStatus() != AsyncTask.Status.RUNNING) {
            instance.execute();
        }
    }
        
    @Override
    protected void onCancelled(Void result) {
        super.onCancelled(result);
        
        Log.i("TAG", "canceled");
    }
 
    public void stop() {
        instance.cancel(true);
        instance = null;
        
        IODialog.getInstance().clearOutput();
        
        ESiInterpreter.conditionVar.open();
        ESiInterpreter.conditionVar.close();
    }
    
    public void publshProgrss(Character c) {
        publishProgress(c);
    }
    
    public void enablePutButton() {
        // put button will be enabled in publishProgress
        isPutButtonEnabled = true;
        // call publishProgress with empty value
        publishProgress('\0');
    }
}



conditionVar нужна для того, чтобы ждать пока пользователь введет значение и нажмет Put кнопку. Вроде все работает хорошо, но когда
я запускаю IODialog и меняю ориентацию устройства, по идее у меня должно прервать покот и начать выполнять его заново, но этого не происходит.
Знаю, что в самом doInBackground нет кода прерывания, но обычное прерывание здесь не помогло, так как все действия выполняються в Brainfuck.interpret(Source.get());
Я почему то думал, что если написать AsyncTask.cancel(true); то выполнение прервется в любом случае, но этого не происходит.
Так же я пробовал запрещать пересоздание IODialog при смене ориентации, но это тоже не помогло. Помогите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2015, 11:44     Не могу найти ошибку (Потоки)
Посмотрите здесь:

Не могу найти ошибку Android
Android не могу найти ошибку
не могу найти ошибку! Android
Не могу найти ошибку Android
Android Не могу найти ошибку в коде для apk приложения
Найти ошибку Android
Не могу найти ошибку в программном коде Eclipse, Android Android
НЕ могу найти ошибку! Android
Не могу найти ошибку Android
Android Не могу найти ошибку в приложении Earthquake
Нужно найти ошибку в несложном проекте Android
Android Найти ошибку в коде

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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