2013-02-25 7 views
9

EDIT zobacz Observer Observables implementing issue - Wydaje się, że nadpisałem metody, które nie musiały być i nie wywoływanie setChanged(); before notify();Observver/Android

Przeczytałem wzorzec Observer, aby mój interfejs był aktualny, ale nadal nie widzę dla niego zastosowania. Nawet jeśli w moim konkretnym obiekcie powiadomi moją MainActivity, uruchomi aktualizację(); metoda Wciąż nie byłbym w stanie użyć obiektu Pet do pobrania wartości aktualizacji, ponieważ obiekt jest tworzony w Oncreate ... i po prostu nie mogę utworzyć nowego obiektu, ponieważ wtedy zmienne będą różne ... to jest mój wdrożenie i wydaje się, że nie działa.

Obserwator/główną działalność

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 { 

    } 



    } 

} 

Obserwowalne/zwierze

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

myślę, że należy przyjrzeć update: http://www.youtube.com/watch? v = wiQdrH2YpT4 –

Odpowiedz

3

Po pierwsze, nie polecam przesłonić addObserver lub removeObserver w obserwowalnym obiekcie. Interfejs API wykonuje naprawdę dobrą robotę implementacji tego (chyba że potrzebujesz określonej funkcjonalności).

Po drugie, metoda notifyObservers() jest przeciążona, więc można przekazać jej obiekt, tj. notifyObservers(Object obj). Jeśli przekażesz go swoim Pet, notifyObservers(this), będziesz mieć odniesienie do obserwowanego obiektu Pet.

Myślę, że to jest twoje pytanie, ale proszę mnie poprawić, jeśli się mylę.

EDIT: Do wyjaśnienia, moja odpowiedź jest uwarunkowane używasz klasę Observable w Java API here.

Upon dalszego przeglądu, powinny masz już odwołanie do obiektu Pet że nazywa się metodą z Observer

+1

Zobacz mój problem, kiedy już wcześniej zadawałem pytania, na które właśnie rzucił mi kod, na przykład. Powiedziano mi, że będę musiał zaimplementować własny interfejs obserwowalny, którego nie mogę zrozumieć, ponieważ wiem, że napisałem plik Wiem, że to nic nie robi ... to jest mój obserwowalny interfejs .. 'pakiet com .grim.droidchi; import java.util.Observer; publiczny interfejs Obserwowalny { \t \t publiczny void addObserver (Obserwator o); \t publiczny void removeObserver (Observer o); \t publiczne void notifyObservers (Observer o); } ' – Pheonix2105

+0

Interfejs API języka Java ma możliwą do zaobserwowania klasę: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.html. Gorąco poleciłbym rozszerzenie tej klasy w przeciwieństwie do pisania własnego, domowego rozwiązania.Zdaję sobie sprawę, że inni mogą nie zgadzać się z tym podejściem, ponieważ wymaga to przejścia wokół obiektów i wykonania instancji, ale myślę, że może spełnić twoje wymagania. – nattyddubbs

+0

Nie ma dostępnej obserwowalnej do rozszerzenia, muszę stworzyć własny interfejs lub po prostu powiedzieć " Obserwowalne nie można rozwiązać na typ " – Pheonix2105

1

Twój pet nie jest dostępna w innych metodach, ponieważ jej nie określono na poziomie globalnym.

Należy zdefiniować Pet pet = new Renamon(); poza metodą onCreate.