Android Textview赢得';t显示模型(MVC)中已更新的数据

Android Textview赢得';t显示模型(MVC)中已更新的数据,android,multithreading,android-activity,action,Android,Multithreading,Android Activity,Action,我尝试了以下方法来尝试从模型更新TextView: TextChangeListeners-错误 其他线程 异步任务 添加了一个更新数据的刷新按钮,我强制单击 情况如下: 标准线程运行,每秒钟更新一次模型(MVC)对象,工作正常 当模型对象更新时,它会通知所有实现“观察者”的类 My GolfHomeScreen扩展了活动并实现了Observer(代码如下) GolfHomeScreen.update(可观察的对象数据)方法工作得非常好。它按预期每秒钟执行一次,并S.O.P正确的数据(请参见--

我尝试了以下方法来尝试从模型更新TextView:

  • TextChangeListeners-错误
  • 其他线程
  • 异步任务
  • 添加了一个更新数据的刷新按钮,我强制单击
  • 情况如下:

  • 标准线程运行,每秒钟更新一次模型(MVC)对象,工作正常
  • 当模型对象更新时,它会通知所有实现“观察者”的类
  • My GolfHomeScreen扩展了活动并实现了Observer(代码如下)
  • GolfHomeScreen.update(可观察的对象数据)方法工作得非常好。它按预期每秒钟执行一次,并S.O.P正确的数据(请参见-->/*#1*
  • 这就引出了一条线索。我在这个网站上读到,你必须使用UI线程来执行更新小部件的代码,然后运行“runOnUiThread”方法——代码看起来就像我在下面做的一样,但我发现有点难以理解。无论如何,该线程运行(请参见-->/*#2),然后执行方法onClick(视图v)(请参见-->/#3*
  • System.out.println(“driverType:+mvcModel.getDriverName())(请参阅-->/*#4*)工作正常
  • //*#5*-它必须更新,但不能更新
  • 如果我实际单击按钮,数据将正确显示在屏幕上。我唯一的猜测是屏幕不能在强制单击时刷新,否则我没有使用UI线程进行更新
  • 注意:如果下面的代码遗漏了什么,那是因为我删除了大量代码以简化对所发生的事情的理解

    public class GolfHomeScreen extends Activity implements Observer
    {
        GolfHomeScreen golfHomeScreen = null;
        TextView driverName = null; // Type of driver used by golfer (eg: 1 wood)
        Button refreshData = null;
    
      @Override public void onClick(View v) //*** #3 ***
      {
        if ((v.getId()) == 12345) // ID of wood (12345 = 1 wood)
        {
                        //*** #4 ***
            System.out.println("driverType              :" + mvcModel.getDriverName()); //THIS PRINTS OUT THE LATEST DATA!!!
    
                        //*** #5 ***
                        driverName.setText(String.valueOf(mvcModel.getDriverName()));   //THIS DOESN'T AFFECT THE SCREEN?? WHY  :-(
        }
      }
    
      @Override public void onCreate(Bundle savedInstanceState)
      {
        golfHomeScreen = this;
        refreshData = indViewById(R.id.golfhomescreen_button_refreshData);
        driverName = (TextView) findViewById(R.id.golfhomescreen_text_drivername);
      }
    
      @Override public void update(Observable observable, Object data)
      {
         // #1 ***
        System.out.println("driverType              :" + mvcModel.getDriverName());
    
        golfHomeScreen.runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                refreshData.performClick(); //*** #2 ***
            }
        });
      }
    

    }

    我将运行一些建议和修复程序,希望您的问题能够解决。 我这么说是因为概念上你确实有一些错误的东西,我的答案是修正这些概念:

    • 删除
      GolfHomeScreen GolfHomeScreen=null
      golfHomeScreen=this不需要对象引用自身。这只是在制造混乱。这一行
      golfHomeScreen.rununuithread(new Runnable()
      您只需调用
      rununuithread(new Runnable()
    • System.out.pr***
      更改为
      Log.d(标记、消息);
      这只是因为这是Android专门用于转储日志的方式,对您的结果来说并不重要。它比标准的Java System.out更好,因为它允许您根据标记和严重性过滤日志
    • 千万不要调用
      refreshData.performClick();
      或任何类似的方法,因为您希望执行该按钮内的操作。如果您希望某件事情从多个源发生,请创建一个方法
      doThatThing()
      ,将操作放在那里,然后从
      单击
      更新
      ,调用该方法。您所做的方式是一台“Rube Goldberg机器”,它正在更新某些内容,单击按钮,更改文本。只需更改文本即可
    • 切勿将视图ID与数字进行比较
      if((v.getId())==12345)
      从XML创建的视图ID是由系统在编译期间生成的,您无法知道它是否是固定数字。您应该与该视图的静态int ID进行比较,如下所示:
      if(v.getId()==R.ID.golfhomescreen\u text\u drivername)
      。如果视图不是用XML创建的(这里不是这种情况),您可以与实际对象进行比较
      If(v.equals(driverName))

    有了这些更改,我相信您的代码会正常工作。如果确实正确,请务必让我知道并标记为正确答案。

    忽略上面的评论-我需要正确地对其进行全面测试,我正在mo的旧笔记本电脑上运行它,无法正确地测试它,但它看起来好像无法正常工作!!!我将在稍后返回de时报告更多信息c机器!!!它不工作了-我改变了我的架构,因为它变得太复杂了!!!为了我自己的利益,我很固执!!!谢谢你的回应