简体   繁体   English

Observable / Observer Android

[英]Observable/Observer Android

EDIT please see Observer Observables implementing issue - It seems I was overriding methods that didn't need to be and not calling setChanged(); 编辑请参阅Observer Observables实现问题 - 似乎我重写了不需要的方法而不是调用setChanged(); before notify(); 在notify()之前;

I've been reading up on the Observer Pattern for keeping my UI up to date but I still can't see the use for it.. Even if in my particular object notifies my MainActivity then runs the update(); 我一直在阅读观察者模式,以保持我的UI更新,但我仍然看不到它的使用..即使在我的特定对象通知我的MainActivity然后运行update(); method I still wouldn't be able to use the Pet object to pull the update values as the object is created in Oncreate...and I just can't create a new object because then the variables will be different..this is my implementation and it doesn't seem to work. 方法我仍然无法使用Pet对象来提取更新值,因为在Oncreate中创建对象...而我只是无法创建新对象,因为那时变量将是不同的...这是我的实施,它似乎不起作用。

Observer/MainActivity 观察/ 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 {

    }



    }

}

Observable/Pet 可观察/宠物

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() {

    }

}

First, I wouldn't recommend overriding addObserver or removeObserver in your observable object. 首先,我不建议在您的可观察对象中覆盖addObserverremoveObserver The API does a really good job of implementing this (unless you want some specific functionality). API在实现它方面做得非常好(除非你想要一些特定的功能)。

Second, the method notifyObservers() is overloaded so that you can pass it an object, IE notifyObservers(Object obj) . 其次,方法notifyObservers()被重载,以便您可以传递一个对象,IE notifyObservers(Object obj) If you pass it your Pet , notifyObservers(this) , then you will have a reference to your Pet object that is being observed. 如果您将PetnotifyObservers(this)传递给它,那么您将获得对正在观察的Pet对象的引用。

I think this is your question but please correct me if I am wrong. 我想这是你的问题,但如果我错了,请纠正我。

EDIT : To clarify, my answer is contingent upon you using the Observable class in the Java API here . 编辑 :为了澄清,在您使用我的回答是偶然Observable Java API中的类

Upon further review, you should already have a reference to the Pet object that called the update method of the Observer 进一步检查后,您应该已经引用了调用Observer update方法的Pet对象

Your pet is not accessible in other methods because its not defined at global level. 您的pet无法通过其他方法访问,因为它未在全球范围内定义。

You should define Pet pet = new Renamon(); 你应该定义Pet pet = new Renamon(); outside of onCreate method. onCreate方法之外。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM