我尝试了以下方法来尝试从模型中更新 TextView:
- TextChangeListeners - 错误
- 其他主题
- 异步任务
- 添加了更新数据的刷新按钮,我强制点击
场景如下:
- 标准线程运行,每秒更新模型(MVC)对象,完美运行。
- 当模型对象更新时,它会通知所有实现“观察者”的类。
- 我的 GolfHomeScreen 扩展了 Activity 并实现了 Observer(下面的代码)。
- GolfHomeScreen.update (Observable observable, Object data) 方法完美运行。它按预期每秒执行一次,并 SOP 正确的数据(参见 --> // * #1 *)。
- 然后这会启动一个线程。我在这个网站上读到,你必须使用 UI 线程来执行更新小部件的代码,然后运行“runOnUiThread”方法 - 代码看起来像我在下面所做的,但我发现它有点难以理解。无论如何,这个线程运行(见 --> // * #2) 然后执行 onClick(View 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 ***
}
});
}
}