2013-02-25 20 views
9

संपादित करें कृपया Observer Observables implementing issue देखें - ऐसा लगता है कि मैं उन तरीकों को ओवरराइड कर रहा था जिन्हें सेट करने और सेट करने की आवश्यकता नहीं थी; सूचित करने से पहले();अवलोकन/पर्यवेक्षक एंड्रॉइड

मैं अपने यूआई को अद्यतित रखने के लिए ऑब्जर्वर पैटर्न पर पढ़ रहा हूं लेकिन मैं अभी भी इसका उपयोग नहीं देख सकता .. यहां तक ​​कि अगर मेरी विशेष वस्तु में मेरी मुख्य गतिविधि को सूचित किया जाता है तो अद्यतन(); विधि मैं अभी भी अद्यतन ऑब्जेक्ट को खींचने के लिए पालतू ऑब्जेक्ट का उपयोग करने में सक्षम नहीं होगा क्योंकि वस्तु ऑनक्रेट में बनाई गई है ... और मैं बस एक नई वस्तु नहीं बना सकता क्योंकि तब चर अलग होंगे .. यह मेरा है कार्यान्वयन और यह काम नहीं लग रहा है। क्योंकि वैश्विक स्तर पर इसकी परिभाषित नहीं

पर्यवेक्षक/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 विधि कहा जाता है कि के लिए एक संदर्भ होना चाहिए? v = wiQdrH2YpT4 –

उत्तर

3

सबसे पहले, मैं आपके पर्यवेक्षण ऑब्जेक्ट में addObserver या removeObserver ओवरराइड करने की अनुशंसा नहीं करता। एपीआई इसे लागू करने का वास्तव में अच्छा काम करता है (जब तक कि आप कुछ विशिष्ट कार्यक्षमता नहीं चाहते)।

दूसरा, विधि notifyObservers() अधिभारित है ताकि आप इसे एक ऑब्जेक्ट, आईई notifyObservers(Object obj) पास कर सकें। यदि आप इसे Pet, notifyObservers(this) पास करते हैं, तो आपके पास देखा जा रहा है कि आपके Pet ऑब्जेक्ट का संदर्भ होगा।

मुझे लगता है कि यह आपका प्रश्न है लेकिन अगर मैं गलत हूं तो कृपया मुझे सही करें।

संपादित: स्पष्ट करने के लिए, मेरा उत्तर आप जावा एपीआई here में Observable वर्ग का उपयोग कर पर निर्भर है। http://www.youtube.com/watch:

अधिक समीक्षा के बाद, आप पहले से ही Pet वस्तु Observer

+1

यह समस्या मुझे लगता है, जब मैंने पहले प्रश्न पूछे हैं तो मैंने उदाहरण के लिए मेरे पास कोड डाला है। मुझे बताया गया कि मुझे अपने स्वयं के एक अवलोकन इंटरफ़ेस को लागू करने की आवश्यकता होगी जिसे मैं समझ नहीं पा रहा हूं क्योंकि मुझे पता है कि मैंने फ़ाइल क्यों लिखी है, मुझे पता है कि यह कुछ भी नहीं करता है ... यह मेरा अवलोकन इंटरफ़ेस है .. 'पैकेज कॉम .grim.droidchi; आयात java.util.Observer; सार्वजनिक इंटरफ़ेस अवलोकन योग्य { \t \t सार्वजनिक शून्य addObserver (पर्यवेक्षक ओ); \t सार्वजनिक शून्य हटाने ओब्सर्वर (पर्यवेक्षक ओ); \t सार्वजनिक शून्य अधिसूचनाएं ऑब्सर्वर (पर्यवेक्षक ओ); } ' – Pheonix2105

+0

जावा एपीआई में यहां एक अवलोकन योग्य वर्ग है: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.html। मैं इस वर्ग को अपने घर के उगाए गए समाधान लिखने के विरोध में अत्यधिक अनुशंसा करता हूं।मुझे एहसास है कि दूसरों को इस दृष्टिकोण से असहमत हो सकता है क्योंकि आपको ऑब्जेक्ट्स को पास करने और 'इंस्टेंसफॉफ़' करने की आवश्यकता होती है, हालांकि मुझे लगता है कि यह आपकी आवश्यकताओं को पूरा कर सकता है – nattyddubbs

+0

विस्तार करने के लिए कोई अवलोकन योग्य नहीं है, मुझे अपना इंटरफ़ेस बनाना है या यह सिर्फ " अवलोकन योग्य को " – Pheonix2105

1

आपका pet अन्य तरीकों में सुलभ नहीं है।

आपको के बाहर विधि को परिभाषित करना चाहिए।