Android-активность для обработки многопоточности - PullRequest
1 голос
/ 14 ноября 2011

В моем классе активности я хочу выполнить серию длинных вычислений, которые требуют около 5 секунд, чтобы завершиться, когда я нажимаю кнопку. Поэтому, чтобы сделать это, я создал новый класс, который выполняет все вычисления в своем методе run (поскольку он реализует Runnable), и когда он закончил, я установил для переменной значение true, чтобы указать это. В коде, который проверяет, нажата ли кнопка, я запускаю новый поток, передавая в нем мой класс, а затем проверяю, завершился ли метод run или нет. Если это закончилось, я распечатал данные. Проблема в том, что когда я проверяю, завершены ли вычисления, они фактически не имеют, поэтому он проходит эту строку кода и никогда не печатает данные. Я пытался сделать метод класса Async, но все же я думаю, что он не будет работать. Есть ли способ создать поток, когда я нажимаю кнопку и продолжаю проверять, закончил ли я, чтобы я мог распечатать данные? Какой фрагмент кода в Деятельности фактически выполняется снова и снова? Спасибо за любую информацию.

if(v.equals(this.button)) {
             EditText param1 =  (EditText)findViewById(R.id.param1);
             EditText param2 = (EditText)findViewById(R.id.param2);

            calculations = new MathCalc(param1.getText().toString(), param2.getText().toString());

            new Thread(calculations).start();

            while(!calculations.isReady());

            Intent intent = new Intent(this,Show.class);
            intent.putExtra("show1", calculations.getResult());
            startActivity(intent);

            }

Это то, чего я хочу достичь.

Ответы [ 3 ]

3 голосов
/ 14 ноября 2011

AsyncTask - правильный инструмент для этого. Типичным вариантом использования AsyncTask является то, что вы хотите сделать что-то маленькое в фоновом режиме и оставить отзыв через пользовательский интерфейс до, во время и / или после выполнения задачи.

Имейте в виду, что запуск вещей в фоновом режиме может вызвать проблемы, если пользователь часто выходит из системы и перезапускает ее, поскольку фоновая задача не завершится, когда действие будет удалено с экрана.

Пример деятельности показан ниже. Вы можете добавить методы onPreExecute и onProgress в AsynchTask, чтобы предоставить обратную связь с пользователем до и во время вычисления.

    public class CalcActivity extends Activity {
    private Button button;
    private TextView resultView;

    public void onCreate() {
        button = (Button) findViewById(R.id.my_button);
        resultView = (TextView) findViewById(R.id.result);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                button.setEnabled(false);
                AsyncCalculation calc = new AsyncCalculation();
                calc.execute();
            }
        });
    }

    public class AsyncCalculation extends AsyncTask<Void, Void, Integer> {

        @Override
        protected Integer doInBackground(Void... params) {
            int result = 0;
            // Do some calculation
            return result;
        }

        @Override
        protected void onPostExecute(Integer result) {
            // Set the result, start another activity or do something else
            resultView.setText("The result was " + result);
            button.setEnabled(true);
        }

    }

}
2 голосов
/ 14 ноября 2011

Я не понимаю, как это не будет работать с AsyncTask .Вам нужно переопределить два метода - doInBackground() и onPostExecute().Вы гарантировано, что onPostExecute() будет вызываться в потоке пользовательского интерфейса после завершения фоновых вычислений.Вам также не нужно беспокоиться о том, как обновить поток пользовательского интерфейса из другого потока.

Вот хороший пример .

1 голос
/ 14 ноября 2011

Использовать

Button someButton = (Button) findViewById(R.id.favouriteButton);
someButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                Thread thread = new Thread(new Runnable() {
                       @Override
                        public void run() {

                            while(!isDone){
                               doAlotOfCalculations();
                            }
                        }
                });
                thread.start();
              } 
});




private void doAlotOfCalculations(){
    ...    
    if(whenDone){
        isDone = true;
    }
    ....
}

Какой фрагмент кода в Деятельности фактически выполняется снова и снова?

Нет такой вещи.Это просто onResume, который выполняется каждый раз, когда вы запускаете (перезапускаете) это действие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...