public TextView name_place; 私人ImageView照片;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
name_place = (TextView) findViewById(R.id.name);
foto = (ImageView) findViewById(R.id.foto);
settings = getSharedPreferences("USER_INFO", 0);
UserName = settings.getString("USER_NAME",null);
UserId = settings.getString("USER_ID",null);
...
new Thread(new Runnable() {
public void run() {
while(true){
setupThings();
try {
Thread.sleep(5000);
}catch(Exception e){}
}
}
}).start();
}
public void setupThings(){
UserName = settings.getString("USER_NAME",null);
UserId=settings.getString("USER_ID",null);
try {
name_place.setText("" + UserName.toString());
}catch(Exception e){
Log.w("LOG",name_place.getText().toString());
}
}`
我的问题是为什么TRY块中的setText()不起作用,但CATCH块中的getText()完全正常。
(只有一个xml - activity_main.xml)
答案 0 :(得分:3)
我的问题是为什么TRY块中的setText()不起作用,但CATCH块中的getText()完全正常。
你必须得到日志说的异常。无法从非UI线程触摸视图。
您只需使用UI线程在设备屏幕上进行可视化更改。
替换此
new Thread(new Runnable() {
public void run() {
while(true){
setupThings();
try {
Thread.sleep(5000);
}catch(Exception e){}
}
}
}).start();
带
setupThings();
仅删除onCreate中的其他线程启动部分。当你在屏幕上进行视觉上的改变时,这不会崩溃" setText"使用UI线程。
尝试查看结果。
其次:
如果您想先在后台执行某些操作,然后根据其结果更新ui。使用AsyncTasks。谷歌它如何运作。那里有成千上万的例子。
第三
你从代码前瞻中做了很多错事。
1)错误的命名约定。
2)不要使用泛型catch(Exception ex)块。并且至少在没有记录崩溃堆栈的情况下不会为空。
3)不使用AsyncTasks。
答案 1 :(得分:1)
您为空的首选项键返回 null :
UserName = settings.getString("USER_NAME",null);
UserId = settings.getString("USER_ID",null);
所以,既然你不能使用 null 就像它是一个字符串一样,你可能想要重写它:
UserName = settings.getString("USER_NAME", "");
UserId = settings.getString("USER_ID", "");