Передача переменной в методы (Java) - PullRequest
0 голосов
/ 13 января 2012

Я новичок в Java, и у меня проблема.Я скопировал некоторый код из учебника для Android, и теперь я хочу передать целочисленную переменную в метод run (), чтобы я мог увеличивать его для каждого цикла и затем перехватывать его вне фонового потока.Как бы я это сделал?

int gg= 0;    
Thread background = new Thread(new Runnable() {
                    public void run() {
                        try {

                            while (pBarDialog.getProgress() <= 100) {

                                Thread.sleep(100);
                                gg++; // the increment here
                                progressHandler.sendMessage(progressHandler
                                        .obtainMessage());


                            }
                            if (pBarDialog.getProgress() == 100) {
                                pBarDialog.dismiss();

                            }

                        } catch (java.lang.InterruptedException e) {
                            // if something fails do something smart
                        }
                    }

                });
          //catch gg here

Ответы [ 4 ]

3 голосов
/ 13 января 2012

Нельзя указывать аргумент для метода run (). Вы можете объявить переменную int как поле и использовать ее во внутренних классах.

public class TestActivity extends Activity
{
   private volatile int no;
   .....

}

РЕДАКТИРОВАТЬ: (Предложение от @alf) Вы можете использовать volatile модификатор с полем, так что измененное значение будет видно сразу всем другим потокам.

1 голос
/ 13 января 2012

Есть свой собственный класс и передать счетчик, используя его конструктор, я не пробовал это, но я бы начал с чего-то вроде:

class MyThread implements Runnable {

   private volatile int counter;

   public MyThread( int counter ) {
       this.counter = counter;
   }

   public void run() {
   ...
   }

   public getCounter() {
      return counter;
   }
}

MyThread mt = new MyThread( 10 );
Thread t = new Thread( mt );
t.start();

// after some time
t.getCounter();
0 голосов
/ 13 января 2012

На вашем месте я бы изучил AtomicInteger , а именно метод incrementAndGet().

Создание gg поля действительно даст потоку доступ к gg, а volatile сделает изменения видимыми , но поскольку ваши намерения не ясны, Я не могу быть уверен, что у вас нет других потоков, увеличивающих то же значение: у вас нет атомарности, , поэтому, как только у вас будет несколько потоков, выполняющих gg++, вы, вероятно, получить неверные результаты.

0 голосов
/ 13 января 2012
private volatile int gg;

public void myMethod() {
    Thread background = new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                while (pBarDialog.getProgress() <= 100) {
                    Thread.sleep(100);
                    gg++; // the increment here
                    progressHandler.sendMessage(progressHandler.obtainMessage());
                }
                if (pBarDialog.getProgress() == 100) {
                    pBarDialog.dismiss();
                }
            } catch (java.lang.InterruptedException e) {
                // if something fails do something smart
            }
        }

    });

    System.out.println(gg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...