如果我在另一个线程上阅读视图,Android UI是否正确
Android不能在非ui线程上直接更新视图,但如果我只是读取/获取一些ui信息 例如,我有一个类似updateModel()的方法如果我在另一个线程上阅读视图,Android UI是否正确,android,multithreading,view,Android,Multithreading,View,Android不能在非ui线程上直接更新视图,但如果我只是读取/获取一些ui信息 例如,我有一个类似updateModel()的方法 在非ui线程上运行此方法是否有问题。下面的示例帮助我解决了此问题。希望这对你也有帮助 runOnUiThread(new Runnable() { @Override public void run() { //do your job } }); 是的,您可以从非UI线程更新UI。有
在非ui线程上运行此方法是否有问题。下面的示例帮助我解决了此问题。希望这对你也有帮助
runOnUiThread(new Runnable() {
@Override
public void run() {
//do your job
}
});
是的,您可以从非UI线程更新UI。有两种方法可以做到这一点 1) 使用活动对象执行此操作(简单选项获取和更新) 2) 使用消息执行此操作(有点困难,仅更新)
对于第一个,您所需要做的就是将活动传递到构造函数中。下面是线程片段
public class MyThread extends Thread {
private Activity _activity;
public MyThread(Activity activity) {
this._activity = activity;
}
@Override
public void run() {
super.run();
//do all what you want. and at the end to Update the Views Do this
if(!this._activity.isFinishing())
{ // executed if the activity is not finishing
this._activity.runOnUiThread(new Runnable() {
@Override
public void run() {
//set the public variables UI Variables like this
dailyReport.log.setValue(this._activity.editLog.getText().toString());
dailyReport.plan.setValue(this._activity.editPlan.getText().toString());
dailyReport.question.setValue(this._activity.editQuestion.getText().toString());
});
}
}
}
现在正在活动中
MyThread thread = new MyThread(this);
thread.start;
在非ui线程上运行此方法是否有问题? 假设
dailyPlan
是一个模型类,其方法不会修改UI,那么不,这不是问题,Android不会抱怨,您也不会收到任何运行时错误。但是,我不会采用这种方法,因为通常从另一个线程直接访问一个线程的数据是一种不好的做法——您永远不知道谁在修改什么,可能会发生读/写问题等等。这些问题通常通过同步数据来解决,但如果将synchronized
代码放在UI线程中,则会使事情变得更糟
对于这类问题,为什么不将UI控件中的数据传递给使用上述逻辑的线程呢?创建时,传递3个字符串:
editLog.getText().toString()
editPlan.getText().toString()
editQuestion.getText().toString()
private EditText editLog;
private EditText editPlan;
private EditText editQuestions;
private void activityMethodThatStartsThread() {
String log = editLog.getText().toString();
String plan = editPlan.getText().toString();
String questions = editQuestions.getText().toString();
DailyReportModel model = new DailyReportModel(log, plan, questions);
model.start();
}
public class DailyReportModel extends Thread {
private String log;
private String plan;
private String questions;
public DailyReportModel(String log, String plan, String questions) {
super();
this.log = log;
this.plan = plan;
this.questions = questions;
}
void updateModel() {
dailyReport.log.setValue(log);
dailyReport.plan.setValue(plan);
dailyReport.question.setValue(questions);
}
}
是,您不能从非ui更新uithread@Raghunandan你是wrong@NSQuamber.java怎么样explain@Raghunandan稍后发布答案,您可以查看。@NSQuamber.java您无法从非ui线程更新ui。op正在将一个值设置为textview或EditText
问题。setValue
。你会被错误的线程调用
private EditText editLog;
private EditText editPlan;
private EditText editQuestions;
private void activityMethodThatStartsThread() {
String log = editLog.getText().toString();
String plan = editPlan.getText().toString();
String questions = editQuestions.getText().toString();
DailyReportModel model = new DailyReportModel(log, plan, questions);
model.start();
}
public class DailyReportModel extends Thread {
private String log;
private String plan;
private String questions;
public DailyReportModel(String log, String plan, String questions) {
super();
this.log = log;
this.plan = plan;
this.questions = questions;
}
void updateModel() {
dailyReport.log.setValue(log);
dailyReport.plan.setValue(plan);
dailyReport.question.setValue(questions);
}
}