編輯請參閱Observer Observables implementing issue - 看來我重寫了不需要的方法,而不是調用setChanged();在notify()之前;Observable/Observer Android
我一直在閱讀觀察者模式,以保持我的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() {
}
}
我想你應該看看該
update
方法的引用:http://www.youtube.com/watch? v = wiQdrH2YpT4 – 2013-02-25 14:13:35