Ошибка при использовании setText в runInUiThread

Мне нужен поток, который некоторое время ждет, а затем меняет текст в TextView. Мой поиск нашел как использовать runOnUiThread

Я понял первый ответ и попытался использовать его в своем коде, но получаю сообщение об ошибке при вызове setText в потоке.

Вот мой код (start - это функция кнопки onClick):

public class MainActivity extends AppCompatActivity {

    public int i = 0;
    private TextView mText;
    private Thread thread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mText = (TextView)findViewById(R.id.text);
    }

    public void start (View v) {
        runThread();


    }

    private void runThread() {

        new Thread() {
            public void run() {
                while (true) {
                    try {
                        runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                i++;
                                mText.setText((i));
                            }
                        });
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

}

вот моя ошибка

09-26 20:26:34.054 22254-22254/com.horizon.testtimerthread E/AndroidRuntime: FATAL EXCEPTION: main
                                                                             android.content.res.Resources$NotFoundException: String resource ID #0x1
                                                                                 at android.content.res.Resources.getText(Resources.java:1058)
                                                                                 at android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52)
                                                                                 at android.widget.TextView.setText(TextView.java:3866)
                                                                                 at com.horizon.testtimerthread.MainActivity$1$1.run(MainActivity.java:39)
                                                                                 at android.os.Handler.handleCallback(Handler.java:615)
                                                                                 at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                                 at android.os.Looper.loop(Looper.java:177)
                                                                                 at android.app.ActivityThread.main(ActivityThread.java:4947)
                                                                                 at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                 at java.lang.reflect.Method.invoke(Method.java:511)
                                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
                                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
                                                                                 at dalvik.system.NativeStart.main(Native Method)

Спасибо заранее за вашу помощь.


person Gitton Florian    schedule 26.09.2016    source источник


Ответы (2)


mText.setText((i)) это проблема.

Android думает, что вы ссылаетесь на идентификатор строки, и происходит сбой, потому что он не может найти строку с идентификатором 1. Если вы хотели установить текст в «1», «2» и т. д., тогда напишите mText.setText((Integer.toString(i)))

person Shmuel    schedule 26.09.2016
comment
Я чувствую себя таким глупым прямо сейчас. Да работает спасибо. - person Gitton Florian; 27.09.2016
comment
Не беспокойтесь ;) Вы будете использовать это в будущем как пример того, насколько вы выросли. - person Shmuel; 27.09.2016

Поскольку i имеет тип int, вы вызываете setText(int resourceId) вариант функции, чего явно не хотите. setText(String.valueOf(i)) должно работать.

person Anton Malyshev    schedule 26.09.2016