Возвращаемое значение из потока Java/Android

У меня есть следующий поток в моем классе Android. Как я могу получить значение ошибки из потока???

public int method(){
new Thread(new Runnable() {
        int err;

        @Override
        public void run() {
            err = device.verify(30, 5, coderChoice, detectModeChoice,
                      0, listSearch, callbackCmd, MTFPSD.this, matchingScore);
            updateView("Finger Captured Successfully", err);

        }
    }).start();

return err;
}

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


person Astora    schedule 23.02.2015    source источник


Ответы (3)


У вас есть два способа добиться этого.

  1. Плохой способ. Создайте изменяемый объект, например список целых чисел, и позвольте потоку (исполняемому) выполнять запись в список. Вы можете получить доступ к значению в списке во внешнем классе/методе.

  2. Используйте Callable вместо Runnable . Callable может возвращать значения

person TheLostMind    schedule 23.02.2015
comment
Большое спасибо! Я попробую их обоих. - person Astora; 23.02.2015
comment
@Astora - В случае Android вы также можете использовать обработчик. :) - person TheLostMind; 23.02.2015

В противном случае вы можете использовать Handler для получения значения err.

public void method(){
    new Thread(new Runnable() {
            int err;

            @Override
            public void run() {
                err = device.verify(30, 5, coderChoice, detectModeChoice,
                          0, listSearch, callbackCmd, MTFPSD.this, matchingScore);
                updateView("Finger Captured Successfully", err);

                mHandler.sendEmptyMessage(err);

            }
        }).start();

    return;
    }

Handler mHandler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        int err = msg.what;

        // something to do.

    }
};
person JK Park    schedule 23.02.2015

Это то, что я делаю, когда мои Runnable и Handler находятся в разных классах ^_^

public void task(final Handler h){


        Runnable r = new Runnable() {
            @Override
            public void run() {
                //Do something...

                Bundle bundle = new Bundle();
                bundle.putString("Value", "Done");
                Message toDeliver = new Message();
                toDeliver.setData(bundle);
                h.sendMessage(toDeliver);

            }
        };

        Thread thread = new Thread(r);
        thread.start();

    }



Handler h = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                Bundle bundle = msg.getData();
                String result = bundle.getString("Value");
                Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();
            }
        };
person Hussam Mohammed Nasar    schedule 15.08.2016