我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。
观察者/ MainActivity
package com.grim.droidchi; import java.util.Observable; import java.util.Observer; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.webkit.WebSettings.LayoutAlgorithm; import android.webkit.WebView; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements Observer, OnClickListener { private static final String TAG = "VPET"; private static final String APP_PREFS = "VPET"; private static final int REQUEST_CODE = 1; Boolean isAlive = false; TextView happiness_display, health_display, hunger_display, level_display; Button PunchPet, UpdateHunger; public static Pet pet = new Renamon(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences settings = getSharedPreferences("APP_PREFS", MODE_PRIVATE); WebView myWebView = (WebView) findViewById(R.id.pet_display); myWebView.loadUrl("file:///android_asset/renamon.gif"); myWebView.setInitialScale(10000); myWebView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); PunchPet = (Button) findViewById(R.id.PunchPet); UpdateHunger = (Button) findViewById(R.id.UpdateHunger); final TextView hunger_display = (TextView) findViewById(R.id.hunger_display); TextView happiness_display = (TextView) findViewById(R.id.happiness_display); TextView level_display = (TextView) findViewById(R.id.level_display); TextView health_display = (TextView) findViewById(R.id.health_display); hunger_display.setText(Integer.toString(pet.getHunger())); health_display.setText(Integer.toString(pet.getHP())); level_display.setText(Integer.toString(pet.getLVL())); happiness_display.setText(Integer.toString(pet.getHappy())); Intent intent = new Intent(this, Gameloop.class); PendingIntent pendingIntent = PendingIntent.getBroadcast( getBaseContext(), REQUEST_CODE, intent, 0); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (5 * 1000), 1800000, pendingIntent); // 1800000 ms = 30 mins pet.feed(); pet.addObserver(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override protected void onPause() { super.onPause(); } @Override public void update(Observable o, Object data) { hunger_display.setText(Integer.toString(pet.getHunger())); health_display.setText(Integer.toString(pet.getHP())); level_display.setText(Integer.toString(pet.getLVL())); happiness_display.setText(Integer.toString(pet.getHappy())); Log.d(TAG, "UPDATED FROM OBSERVER"); } @Override public void onClick(View v) { if (v == PunchPet) { pet.setHP(500); Toast.makeText(getApplicationContext(), "PUNCHPET", Toast.LENGTH_SHORT).show(); health_display.setText(Integer.toString(pet.getHP())); }else { } } }
可观察/宠物
package com.grim.droidchi; import java.util.Observable; import java.util.Observer; import java.util.Set; import android.util.Log; public class Pet extends Observable implements PetInterface { protected Set<Observer> observers; private static final String TAG = "VPET"; private int Health = 100; @Override public void addObserver(Observer o) { observers.add(o); super.addObserver(o); } @Override public void notifyObservers() { observers.notify(); super.notifyObservers(); } @Override public synchronized void deleteObserver(Observer o) { observers.remove(o); super.deleteObserver(o); } private int Happiness = 10; private int Level = 1; private int Hunger = 0; private int Exp = 0; private String Name; private Boolean isAlive = true; private Boolean isSick = false; public void setHP(int hp) { this.Health = hp; notifyObservers(hp); } public void setLVL(int lvl) { this.Level = lvl; notifyObservers(lvl); } public void setXP(int xp) { this.Exp = xp; notifyObservers(xp); } public void setHunger(int hunger) { this.Hunger = hunger; notifyObservers(hunger); } public void setHappy(int happy) { this.Happiness = happy; notifyObservers(happy); } public int getHP() { return Health; } public int getLVL() { return Level; } public int getXP() { return Exp; } public int getHunger() { return Hunger; } public int getHappy() { return Happiness; } public boolean isAlive() { return isAlive; } public boolean isSick() { return isSick; } @Override public void sleep() { // TODO Auto-generated method stub } @Override public void clean() { // TODO Auto-generated method stub } @Override public void feed() { Log.d(TAG, "FEEDING FROM INTERFACE THING"); } @Override public void passtime() { } }
首先,我不建议覆盖addObserver或removeObserver在您的可观察对象中。该API在实现此功能方面做得非常好(除非您需要某些特定功能)。
addObserver
removeObserver
其次,该方法notifyObservers()已重载,因此您可以向其传递IE对象notifyObservers(Object obj)。如果将其传递给Pet,notifyObservers(this)则您将获得对Pet所观察对象的引用。
notifyObservers()
notifyObservers(Object obj)
Pet
notifyObservers(this)
我认为这是您的问题,但如果我错了,请纠正我。
编辑 :澄清一下,我的答案取决于您Observable在此处使用Java API中的类。
Observable
经进一步审查,你应该已经到了一个参考Pet调用该对象update的方法Observer
update
Observer