2013-02-25 24 views
9

EDITObserver Observables implementing issueを参照してください。私は、setChanged()を呼び出す必要がないメソッドをオーバーライドしていたようです。 before notify();Observable/Observer Android

私はUIを最新の状態に保つためにObserver Patternを読んできましたが、私はまだそれを見ることができません。私の特定のオブジェクトがMainActivityに通知しても、update();メソッド私はまだオブジェクトが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法と呼ばれるPetオブジェクトへの参照を持っている必要がありますか? v = wiQdrH2YpT4 –

答えて

3

まず、観測可能オブジェクトにaddObserverまたはremoveObserverを上書きすることはお勧めしません。 APIは、これを実装するのに本当にうまく機能します(特定の機能を必要としない限り)。

第2に、notifyObservers()メソッドがオーバーロードされているため、オブジェクトにIE notifyObservers(Object obj)を渡すことができます。 PetnotifyObservers(this)を渡すと、あなたのPetオブジェクトへの参照が観察されます。

私はこれがあなたの質問だと思っていますが、私が間違っていれば私を修正してください。

EDIT:明確にするために、私の答えは、Java API hereObservableクラスを使用し次第です。 http://www.youtube.com/watch:

さらに検討する際

、あなたはすでに私はあなたが見てみるべきだと思いObserver

+1

これまでに私が以前に質問したときに、たとえば私にコードを投げてしまったと思う問題を見てください。私はObservableインターフェイスを実装する必要があると言われましたが、なぜ私はそれが何もしていないことを知っているファイルを書いたことを理解していないので理解できません...これは私の観測可能なインターフェイスです... 'package com .grimdroidchi; import java.util.Observer; public interface Observable { \t \t public void addObserver(Observer o); \t public void removeObserver(Observer o); \t public void notifyObservers(Observer o); } ' – Pheonix2105

+0

Java APIには、http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.htmlにある観察可能なクラスがあります。私は、あなたの自宅で栽培したソリューションを書くのではなく、このクラスを拡張することを強く勧めます。私はあなたがオブジェクトの周りを渡り、 'instanceof'を実行する必要があるので、他の人がこのアプローチに同意しないかもしれないことに気付きます。 – nattyddubbs

+0

Observableは拡張可能ではありません。自分自身のインターフェースを作成する必要があります。 Observableは型 " – Pheonix2105

1

そのグローバルレベルで定義されていないので、あなたのpetは、他の方法ではアクセスできません。

の外にPet pet = new Renamon();を定義してください。を作成する必要があります。

関連する問題