我正在尝试在一个时间间隔内更新textView。即文本随时间的变化而变化。内容存储在一个数组中,但当我尝试从一个线程中执行时,应用程序崩溃了。这是源代码:
import android.content.Intent;
import android.graphics.Typeface;
import android.net.Uri;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final MessageList sample = new MessageList();
sample.MessageMethod();
final Calendar c = Calendar.getInstance();
new Thread(new Runnable() {
@Override
public void run()
{
int x = 0;
while (i<1)
{
if(c.get(Calendar.MINUTE)%2==0)
{
++x;
TextView alertMessage =
(TextView)findViewById(R.id.messages);
String parse = sample.message[x];
alertMessage.setText(parse);
}
}
}
}).start();
应用程序在使用线程之前已成功运行,我不知道是否由于初始化时出错。有什么建议?
答案 0 :(得分:3)
您必须在UI Thread
中运行此部分代码:
TextView alertMessage = (TextView)findViewById(R.id.messages);
String parse = sample.message[x];
alertMessage.setText(parse);
应该是这样的:
new Thread(new Runnable(){
@Override
public void run(){
int x=0;
while(i<1){
if(c.get(Calendar.MINUTE)%2==0){
++x;
runOnUiThread(new Runnable(){
@Override
public void run(){
TextView alertMessage=(TextView)findViewById(R.id.messages);
String parse=sample.message[x];
alertMessage.setText(parse);
}
});
}
}
}
}).start();
答案 1 :(得分:0)
您无法从UI线程以外的线程更新UI。
TextView alertMessage =
(TextView)findViewById(R.id.messages);
String parse = sample.message[x];
alertMessage.setText(parse); 这一行就是问题所在。
用下面一行替换你的两行textview代码
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView alertMessage =
(TextView)findViewById(R.id.messages);
String parse = sample.message[x];
alertMessage.setText(parse);
}
});
您只能从UI线程更新UI元素。或者你可以在runOnUIThread
您的代码将变为,如下所示
new Thread(new Runnable() {
@Override
public void run() {
int x = 0;
while (i < 1) {
if (c.get(Calendar.MINUTE) % 2 == 0) {
++x;
final String parse = sample.message[x];
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView alertMessage =
(TextView) findViewById(R.id.messages);
alertMessage.setText(parse);
}
});
}
}
}
}).start();
答案 2 :(得分:0)
final Handler handler = new Handler();
new Thread(new Runnable() {
@Override
public void run()
{
int x = 0;
while (i<1)
{
if(c.get(Calendar.MINUTE)%2==0)
{
++x;
handler.post(new Runnable() {
@Override
public void run() {
TextView alertMessage = (TextView)findViewById(R.id.messages);
String parse = sample.message[x];
alertMessage.setText(parse);
}
});
}
}
}
}).start();