GetText()工作正常,但setText()崩溃了应用程序

时间:2014-03-15 15:11:58

标签: java android settext

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)

2 个答案:

答案 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", "");