0

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

  1. TextChangeListeners - 错误
  2. 其他主题
  3. 异步任务
  4. 添加了更新数据的刷新按钮,我强制点击

场景如下:

  1. 标准线程运行,每秒更新模型(MVC)对象,完美运行。
  2. 当模型对象更新时,它会通知所有实现“观察者”的类。
  3. 我的 GolfHomeScreen 扩展了 Activity 并实现了 Observer(下面的代码)。
  4. GolfHomeScreen.update (Observable observable, Object data) 方法完美运行。它按预期每秒执行一次,并 SOP 正确的数据(参见 --> // * #1 *)。
  5. 然后这会启动一个线程。我在这个网站上读到,你必须使用 UI 线程来执行更新小部件的代码,然后运行“runOnUiThread”方法 - 代码看起来像我在下面所做的,但我发现它有点难以理解。无论如何,这个线程运行(见 --> // * #2) 然后执行 onClick(View v) 方法(参见 --> //#3 *)。
  6. System.out.println("driverType :" + mvcModel.getDriverName());(参见 --> // * #4 *)完美运行。
  7. // * #5 * - 它必须更新,但它没有。
  8. 如果我实际单击按钮,则数据会正确显示在屏幕上。我唯一的猜测是屏幕不能在强制点击时刷新,否则我没有使用 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 ***
        }
    });
  }

}

4

1 回答 1

2

我会提出一些建议和一些修复,希望你的问题会消失。我说这是因为从概念上讲你确实有一些错误的东西,我的回答是修正这些概念:

  • removeGolfHomeScreen golfHomeScreen = null;并且golfHomeScreen = this;您不需要引用自身的对象。这只是在制造混乱。这条线golfHomeScreen.runOnUiThread(new Runnable()你应该打电话runOnUiThread(new Runnable()
  • 改变System.out.pr***Log.d(TAG, MESSAGE);只是因为这是 Android 专门的转储日志的方式,它对你的结果并不重要。它比标准的 Java System.out 更好,因为它允许您按 TAG 和严重性过滤这些日志。
  • 不要打电话refreshData.performClick();或任何类似的事情,因为您希望执行该按钮内的操作。如果您希望某件事从多个来源发生,请创建一个方法doThatThing(),将操作放在那里,然后从Click和 从Update调用该方法。你正在做的方式有点像“Rube Goldberg 机器”,它正在更新一些东西,点击一个按钮,改变一个文本。只需更改文本。
  • 切勿将视图 ID 与数字进行比较if ((v.getId()) == 12345),从 XML 创建的视图 ID 是系统在编译期间生成的,您无法知道它是否是固定数字。您应该与该视图的静态 int ID 进行比较,如下所示:if(v.getId() == R.id.golfhomescreen_text_drivername)。如果视图不是在 XML 中创建的(这里不是这种情况),您可以与实际对象进行比较if(v.equals(driverName))

通过这些更改,我相信您的代码将起作用。如果确实如此,请务必让我知道并标记为正确答案。

于 2013-03-03T22:45:12.157 回答