2013-02-25 23 views
9

编辑请参阅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() { 

    } 

} 
+2

我想你应该看看该update方法的引用:http://www.youtube.com/watch? v = wiQdrH2YpT4 – 2013-02-25 14:13:35

回答

3

首先,我不建议在您的可观察对象中重写addObserverremoveObserver。这个API在实现这个方面做得很好(除非你想要一些特定的功能)。

其次,方法notifyObservers()被重载,以便您可以将它传递给一个对象,即IE notifyObservers(Object obj)。如果您通过了Pet,notifyObservers(this),那么您将会看到正在观察的对象Pet

我认为这是你的问题,但请纠正我,如果我错了。

编辑:为了澄清,我的答案取决于您在Java API here中使用Observable类。

经进一步审查,你应该已经到Pet对象调用的Observer

+1

看到多数民众赞成我遇到的问题,当我以前提出的问题,我刚刚有例如对我抛出的代码。我被告知我需要实现一个我自己的Observable接口,我不明白为什么,因为我知道我已经写了文件,我知道它什么都不做......这是我可观察的接口.. 'package com .grim.droidchi; import java.util.Observer; public interface Observable {0} {0};}}}}}}} public void addObserver(Observer o); \t public void removeObserver(Observer o); \t public void notifyObservers(Observer o); }' – Pheonix2105 2013-02-25 14:21:33

+0

java API有一个可观察的类位于:http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.html。我会强烈建议扩展这个类,而不是编写你自己的家庭解决方案。我意识到其他人可能会不同意这种方法,因为它需要你传递Objects和'instanceof',但我认为它可以满足你的要求。 – nattyddubbs 2013-02-25 14:23:32

+0

没有Observable可用于扩展,我必须创建我自己的接口,或者它只是说“ Observable无法解析为类型“ – Pheonix2105 2013-02-25 14:49:25

1

pet没有其他方法访问。

您应该在onCreate方法之外定义Pet pet = new Renamon();