2

Android 无法直接在非 ui 线程上更新视图,但如果我只是阅读/获取一些关于 ui 的信息?

例如我有一个方法 updateModel() 像

void updateModel() {
    dailyReport.log.setValue(editLog.getText().toString());
    dailyReport.plan.setValue(editPlan.getText().toString());
    dailyReport.question.setValue(editQuestion.getText().toString());
}

如果我在非 ui 线程上运行此方法是否有问题。

4

3 回答 3

4

是的,您可以从非 UI 线程更新 UI。有两种方法可以做到这一点。

1)使用活动对象执行此操作(简单的选项获取和更新)

2)使用消息处理程序执行此操作 (有点困难,仅更新)
进行第一个您需要做的就是将 Activity 传递给构造函数。这是线程片段

    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;
于 2013-09-19T06:29:36.567 回答
1

下面的示例帮助我解决了这个问题。希望这对你也有帮助

runOnUiThread(new Runnable() {
        @Override
        public void run() {
            //do your job
        }
    });
于 2013-09-19T05:59:56.857 回答
0

如果我在非 ui 线程上运行此方法是否有问题?

假设dailyPlan是一个模型类并且它的方法不修改 UI,那么不,这不是问题,Android 不会抱怨,你也不会收到任何运行时错误。但是,我不会采用这种方法,因为通常从另一个线程直接访问一个线程数据是一种不好的做法——你永远不知道谁在修改什么,可能会出现读/写问题等等。这些通常是通过同步数据来解决的,但是如果你把synchronized代码放在 UI 线程中,你会让事情变得更糟!

对于您的问题,为什么不将数据从 UI 控件传递到使用上述逻辑的线程?创建它时,传递 3 个字符串:

  1. editLog.getText().toString()
  2. editPlan.getText().toString()
  3. 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);
    }
}
于 2013-09-19T06:49:02.593 回答