Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/199.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在另一个线程上阅读视图,Android UI是否正确_Android_Multithreading_View - Fatal编程技术网

如果我在另一个线程上阅读视图,Android UI是否正确

如果我在另一个线程上阅读视图,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。有

Android不能在非ui线程上直接更新视图,但如果我只是读取/获取一些ui信息

例如,我有一个类似updateModel()的方法


在非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);
        }
    }