在 runInUiThread 中使用 setText 时出错
Error using setText in runInUiThread
我需要一个等待一段时间然后更改 TextView 中的文本的线程。
我的搜索找到 how to use 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.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)
预先感谢您的帮助。
由于 i
的类型为 int,您正在调用 setText(int resourceId)
函数的变体,这显然不是您想要的。 setText(String.valueOf(i))
应该可以。
mText.setText((i))
是问题所在。
Android 认为您引用的是字符串 ID 并且正在崩溃,因为它找不到 ID 为 1 的字符串。如果您打算将文本设置为“1”、“2”等。 .. 然后写 mText.setText((Integer.toString(i)))
我需要一个等待一段时间然后更改 TextView 中的文本的线程。 我的搜索找到 how to use 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.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)
预先感谢您的帮助。
由于 i
的类型为 int,您正在调用 setText(int resourceId)
函数的变体,这显然不是您想要的。 setText(String.valueOf(i))
应该可以。
mText.setText((i))
是问题所在。
Android 认为您引用的是字符串 ID 并且正在崩溃,因为它找不到 ID 为 1 的字符串。如果您打算将文本设置为“1”、“2”等。 .. 然后写 mText.setText((Integer.toString(i)))