Java GetText()工作正常,但setText()会使应用程序崩溃
公共文本视图名称和位置; 私有图像视图fotoJava 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
@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秒更新一次应用程序内部的数据,这是我最好的主意。感谢您阅读此任务并发布此任务的进度代表