TextView をモデルから更新するために、次のアプローチを試しました。
- TextChangeListeners - エラー
- その他のスレッド
- 非同期タスク
- データを更新する更新ボタンを追加しました。クリックを強制します
シナリオは次のとおりです。
- モデル(MVC)オブジェクトを毎秒更新する標準スレッド実行。これは完全に機能します。
- Model オブジェクトが更新されると、「Observer」を実装するすべてのクラスに通知されます。
- 私の GolfHomeScreen は Activity を拡張し、Observer を実装します (以下のコード)。
- GolfHomeScreen.update (Observable observable, Object data) メソッドは完全に機能します。期待どおりに毎秒実行され、正しいデータが SOP されます ( --> // * #1 *を参照)。
- これにより、スレッドが開始されます。このサイトで、ウィジェットを更新するコードを実行してから「runOnUiThread」メソッドを実行するには、UI スレッドを使用する必要があることを読みました。とにかく、このスレッドは実行されます ( --> // * #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 ***
}
});
}
}