Android后台线程无法通过处理程序更改textview
我无法理解为什么在屏幕方向改变后,我的后台线程无法更改textView(txtName)的内容 如果我将txtname设为static,它会工作,但如果没有static,它就不工作。它的初始值没有被后台线程更新Android后台线程无法通过处理程序更改textview,android,Android,我无法理解为什么在屏幕方向改变后,我的后台线程无法更改textView(txtName)的内容 如果我将txtname设为static,它会工作,但如果没有static,它就不工作。它的初始值没有被后台线程更新 private TextView txtName; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout
private TextView txtName;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen2);
txtName = (TextView) findViewById(R.id.txtName);
TextView txtEmail = (TextView) findViewById(R.id.txtEmail);
Button btnClose = (Button) findViewById(R.id.btnClose);
Button btnBack = (Button) findViewById(R.id.btnBack);
Intent i = getIntent();
// Receiving the Data
String name = i.getStringExtra("name");
String email = i.getStringExtra("email");
// String data = i.getStringExtra("data");
// Displaying Received data
txtName.setText("HI");
txtEmail.setText(email);
// Binding Click event to Button
btnClose.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
//Closing SecondScreen Activity
Thread background = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
try {
Thread.sleep(1000);
Message msg = new Message();
Bundle b = new Bundle();
b.putString("My Key", "My Value: " + String.valueOf(i));
msg.setData(b);
// send message to the handler with the current message handler
handler.sendMessage(msg);
Log.e("Error", "IN THREAD");
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
}
});
background.start();
}
});
btnBack.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent returnIntent = getIntent();
returnIntent.putExtra("returnResult","i want to back page.");
setResult(RESULT_OK,returnIntent);
finish();
}
});
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
// get the bundle and extract data by key
Bundle b = msg.getData();
String key = b.getString("My Key");
txtName.setText( "Item " + key);
txtName.setVisibility(View.VISIBLE);
Log.e("TEST MESSAGE", txtName.getText().toString());
}
};
private TextView txtName;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.screen2);
txtName=(TextView)findViewById(R.id.txtName);
TextView-txtEmail=(TextView)findViewById(R.id.txtEmail);
按钮btnClose=(按钮)findViewById(R.id.btnClose);
按钮btnBack=(按钮)findViewById(R.id.btnBack);
Intent i=getIntent();
//接收数据
字符串名称=i.getStringExtra(“名称”);
字符串email=i.getStringExtra(“电子邮件”);
//字符串数据=i.getStringExtra(“数据”);
//显示接收到的数据
txtName.setText(“HI”);
txtEmail.setText(电子邮件);
//将单击事件绑定到按钮
btnClose.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图arg0){
//关闭第二屏幕活动
线程背景=新线程(newrunnable(){
@凌驾
公开募捐{
对于(int i=0;i<30;i++){
试一试{
睡眠(1000);
Message msg=新消息();
Bundle b=新Bundle();
b、 putString(“我的键”,“我的值:”+String.valueOf(i));
msg.setData(b);
//使用当前消息处理程序向处理程序发送消息
handler.sendMessage(msg);
Log.e(“错误”、“线程中”);
}捕获(例外e){
Log.d(“错误”,例如toString());
}
}
}
});
background.start();
}
});
btnBack.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图arg0){
Intent returnIntent=getIntent();
returnIntent.putExtra(“returnResult”,“我想返回页面”);
setResult(结果正常,返回意图);
完成();
}
});
}
Handler=newhandler(){
公共无效handleMessage(消息消息消息){
//获取捆绑包并按键提取数据
Bundle b=msg.getData();
String key=b.getString(“我的键”);
txtName.setText(“项”+键);
txtName.setVisibility(View.VISIBLE);
Log.e(“测试消息”,txtName.getText().toString());
}
};
试试runOnUiThread:
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
Handler handler = new Handler() {
public void handleMessage(Message msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// get the bundle and extract data by key
Bundle b = msg.getData();
String key = b.getString("My Key");
txtName.setText( "Item " + key);
txtName.setVisibility(View.VISIBLE);
Log.e("TEST MESSAGE", txtName.getText().toString());
}
});
}
};
}
将OnClickListener创建为固定类,然后将其应用为:
MyListener myListener = new MyListener();
btnClose.setOnClickListener(myListener);
通过这种方式,
txtName
变量musn不能设置为final您的UI只能由UI线程更新。尝试类似这样的方法,要求您的UI线程尽快更新界面。这样,我认为您可以避免使用处理程序
btnClose.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
//Closing SecondScreen Activity
Thread background = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
try {
Thread.sleep(1000);
final String val = "My Value: " + String.valueOf(i);
// ask UI thread to make the changes as soon as possible
txtName.post(new Runnable(){
public void run(){
txtName.setText( "Item " + val);
txtName.setVisibility(View.VISIBLE);
});
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
}
});
background.start();
}
});
btnClose.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图arg0){
//关闭第二屏幕活动
线程背景=新线程(newrunnable(){
@凌驾
公开募捐{
对于(int i=0;i<30;i++){
试一试{
睡眠(1000);
最终字符串val=“我的值:”+String.valueOf(i);
//请UI线程尽快进行更改
txtName.post(新的Runnable(){
公开募捐{
txtName.setText(“项”+val);
txtName.setVisibility(View.VISIBLE);
});
}捕获(例外e){
Log.d(“错误”,例如toString());
}
}
}
});
background.start();
}
});
我编辑了下面的示例,将您的代码放在OnConfiguration Changed上,仍然使用runOnUiThread。