Android Textview赢得';t显示模型(MVC)中已更新的数据
我尝试了以下方法来尝试从模型更新TextView: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正确的数据(请参见--
System.out.println(“driverType:+mvcModel.getDriverName())代码>(请参阅-->/*#4*)工作正常
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***
这只是因为这是Android专门用于转储日志的方式,对您的结果来说并不重要。它比标准的Java System.out更好,因为它允许您根据标记和严重性过滤日志Log.d(标记、消息);
- 千万不要调用
或任何类似的方法,因为您希望执行该按钮内的操作。如果您希望某件事情从多个源发生,请创建一个方法refreshData.performClick();
,将操作放在那里,然后从doThatThing()
单击
和
更新
,调用该方法。您所做的方式是一台“Rube Goldberg机器”,它正在更新某些内容,单击按钮,更改文本。只需更改文本即可
- 切勿将视图ID与数字进行比较
从XML创建的视图ID是由系统在编译期间生成的,您无法知道它是否是固定数字。您应该与该视图的静态int ID进行比较,如下所示:if((v.getId())==12345)
。如果视图不是用XML创建的(这里不是这种情况),您可以与实际对象进行比较if(v.getId()==R.ID.golfhomescreen\u text\u drivername)
If(v.equals(driverName))
有了这些更改,我相信您的代码会正常工作。如果确实正确,请务必让我知道并标记为正确答案。忽略上面的评论-我需要正确地对其进行全面测试,我正在mo的旧笔记本电脑上运行它,无法正确地测试它,但它看起来好像无法正常工作!!!我将在稍后返回de时报告更多信息c机器!!!它不工作了-我改变了我的架构,因为它变得太复杂了!!!为了我自己的利益,我很固执!!!谢谢你的回应