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

Java GetText()工作正常,但setText()会使应用程序崩溃,java,android,settext,Java,Android,Settext,公共文本视图名称和位置; 私有图像视图foto @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); na

公共文本视图名称和位置; 私有图像视图foto

@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)

对于空的首选项,您将返回null

UserName = settings.getString("USER_NAME",null);
UserId  = settings.getString("USER_ID",null);
因此,由于不能像处理字符串一样处理null,因此可能需要将其重写为:

UserName = settings.getString("USER_NAME", "");
UserId  = settings.getString("USER_ID", "");

您将返回空首选项的null

UserName = settings.getString("USER_NAME",null);
UserId  = settings.getString("USER_ID",null);
因此,由于不能像处理字符串一样处理null,因此可能需要将其重写为:

UserName = settings.getString("USER_NAME", "");
UserId  = settings.getString("USER_ID", "");
我的问题是为什么TRY块中的setText()不起作用,而CATCH块中的getText()工作得非常好

你一定是遇到了异常,日志上写着。无法从非UI线程触摸视图

您只需要使用UI线程在设备屏幕上进行可视更改

替换这个

new Thread(new Runnable() {
    public void run() {
        while(true){
            setupThings();
            try {
                Thread.sleep(5000);
            }catch(Exception e){}
        }
    }
}).start();

仅删除onCreate中的其他线程开始部分。这不会崩溃,因为您正在使用UI线程对屏幕“setText”进行可视更改

试试看结果

第二:

如果您想先在后台执行某些操作,然后根据其结果更新ui。使用异步任务。谷歌搜索它们的工作原理。有成千上万的例子

第三:

从代码的角度来看,您做了很多错误的事情

1) 错误的命名约定

2) 不要使用通用捕获(异常ex)块。至少在没有记录崩溃堆栈的情况下不是空的

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();

仅删除onCreate中的其他线程开始部分。这不会崩溃,因为您正在使用UI线程对屏幕“setText”进行可视更改

试试看结果

第二:

如果您想先在后台执行某些操作,然后根据其结果更新ui。使用异步任务。谷歌搜索它们的工作原理。有成千上万的例子

第三:

从代码的角度来看,您做了很多错误的事情

1) 错误的命名约定

2) 不要使用通用捕获(异常ex)块。至少在没有记录崩溃堆栈的情况下不是空的


3) 不使用异步任务。

你说的“不工作”是什么意思?您得到的异常类型是什么?
UserName=settings.getString(“用户名”,null)
如果此首选项不存在(如您指定的),则返回
null
。检查
UserName
是否不是
null
。在
字符串上调用
toString()
也是无用的……当我尝试Log.w(“Log”,UserName)时,UserName是可以的;它显示了它的完美性你所说的“不起作用”是什么意思?您得到的异常类型是什么?
UserName=settings.getString(“用户名”,null)
如果此首选项不存在(如您指定的),则返回
null
。检查
UserName
是否不是
null
。在
字符串上调用
toString()
也是无用的……当我尝试Log.w(“Log”,UserName)时,UserName是可以的;它显示它完全完美。我试图每5秒更新一次应用程序内部的数据,这是我最好的主意。感谢您的AsyncTask和publishProgress,itI的代表试图每5秒更新一次应用程序内部的数据,这是我最好的主意。感谢您阅读此任务并发布此任务的进度代表