观察观测量实施问题 [英] Observer Observables implementing issue

查看:146
本文介绍了观察观测量实施问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在阅读了关于Observer模式保持我的UI最新的,但我仍然不能得到它的工作,据我了解观察者是我的UI并观看我的宠物类的任何变量的变化,如果有任何它运行更新();在一分钟什么都不做,甚至没有Log.d。

观察/ MainActivity

 包com.grim.droidchi;进口java.util.Observable中;
进口java.util.Observer;进口android.app.Activity;
进口android.app.AlarmManager;
进口android.app.PendingIntent;
进口android.content.Intent;
进口android.content.Shared preferences;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.webkit.WebSettings.LayoutAlgorithm;
进口android.webkit.WebView;
进口android.widget.Button;
进口android.widget.TextView;
进口android.widget.Toast;公共类MainActivity扩展活动实现观测,OnClickListener {
    私有静态最后弦乐TAG =VPET;
    私有静态最后弦乐APP_ preFS =VPET;
    私有静态最终诠释REQUEST_ code = 1;    TextView的happiness_display,health_display,hunger_display,level_display;
    按钮PunchPet,UpdateHunger;
    公共静态宠=新Renamon();    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.activity_main);        的WebView myWebView =(的WebView)findViewById(R.id.pet_display);
        myWebView.loadUrl(文件:///android_asset/renamon.gif);
        myWebView.setInitialScale(10000);
        。myWebView.getSettings()setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
        PunchPet =(按钮)findViewById(R.id.PunchPet);
        UpdateHunger =(按钮)findViewById(R.id.UpdateHunger);
        最终的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()));
        意向意图=新意图(这一点,Gameloop.class);
        的PendingIntent的PendingIntent = PendingIntent.getBroadcast(
                getBaseContext(),REQUEST_ code,意图,0);        AlarmManager alarmManager =(AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis的()+(5 * 1000),180万,的PendingIntent);
        // 1800000毫秒= 30分钟        pet.feed();
        pet.addObserver(本);
        pet.notifyObservers(PET);
    }    @覆盖
    公共布尔onCreateOptionsMenu(菜单菜单){
        //充气菜单;如果是present这增加了项目操作栏。
        。getMenuInflater()膨胀(R.menu.activity_main,菜单);
        返回true;
    }    @覆盖
    保护无效的onPause(){
        super.onPause();
    }    @覆盖
    公共无效更新(可观察到0,对象数据){
        Toast.makeText(getApplicationContext(),soemthing已经改变,Toast.LENGTH_LONG).show();
    }    @覆盖
    公共无效的onClick(视图v){
        如果(V == PunchPet){
            pet.setLVL(50);
            pet.notifyObservers(PET);
            Log.d(TAGPUNCHPET+ pet.getHP());    }其他{    }    }}

观测/宠物

 包com.grim.droidchi;进口java.util.Observable中;
进口android.util.Log;公共类宠物扩展观测工具PetInterface {    私有静态最后弦乐TAG =VPET;
    私人诠释健康= 100;    私人诠释幸福= 10;
    私人INT等级= 1;
    私人INT饥饿= 0;
    私人INT精通= 0;
    私人字符串名称;
    私人布尔的isAlive =真;
    私人布尔isSick = FALSE;    公共无效setisAlive(布尔回答){
        this.isAlive =答案;
    }    公共无效setisSick(布尔回答){
        this.isAlive =答案;
    }    公共无效setHP(INT马力){
        this.Health =马力;
        notifyObservers(马力);
    }    公共无效setLVL(INT LVL){
        this.Level = LVL;
        notifyObservers(LVL);
    }    公共无效setXP(INT XP){
        this.Exp = XP;
        notifyObservers(XP);
    }    公共无效setHunger(INT饥饿){
        this.Hunger =饥饿;
        notifyObservers(饥饿);
    }    公共无效setHappy(INT高兴){
        this.Happiness =幸福;
        notifyObservers(高兴);
    }    公众诠释getHP(){        回到健康;
    }    公众诠释getLVL(){        返回水平;
    }    公众诠释getXP(){        返回精通;
    }    公众诠释getHunger(){        返回饥饿;
    }    公众诠释getHappy(){        回到幸福;
    }    公共布尔的isAlive(){
        返回的isAlive;    }    公共布尔isSick(){
        返回isSick;    }    @覆盖
    公共无效睡眠(){
        // TODO自动生成方法存根    }    @覆盖
    公共无效干净(){
        // TODO自动生成方法存根    }    @覆盖
    公共无效饲料(){
        Log.d(TAG,喂食从接口THING);    }    @覆盖
    公共无效passtime(){    }}

是的,我问过,这也不过如你所知,它有两个答案(这虽然他们也许是对的不帮我),现在不会再接受她会太远掉了下来列表中,如果我可以删除它,我

logcat的

  02-25 22:51:50.381:E / AndroidRuntime(12026):致命异常:主要
02-25 22:51:50.381:E / AndroidRuntime(12026):显示java.lang.NullPointerException
02-25 22:51:50.381:E / AndroidRuntime(12026):在com.grim.droidchi.MainActivity.update(MainActivity.java:93)
02-25 22:51:50.381:E / AndroidRuntime(12026):在java.util.Observable.notifyObservers(Observable.java:138)
02-25 22:51:50.381:E / AndroidRuntime(12026):在com.grim.droidchi.Pet.setHP(Pet.java:33)
02-25 22:51:50.381:E / AndroidRuntime(12026):在com.grim.droidchi.MainActivity $ 1.onClick(MainActivity.java:47)
02-25 22:51:50.381:E / AndroidRuntime(12026):在android.view.View.performClick(View.java:4202)
02-25 22:51:50.381:E / AndroidRuntime(12026):在android.view.View $ PerformClick.run(View.java:17340)
02-25 22:51:50.381:E / AndroidRuntime(12026):在android.os.Handler.handleCallback(Handler.java:725)
02-25 22:51:50.381:E / AndroidRuntime(12026):在android.os.Handler.dispatchMessage(Handler.java:92)
02-25 22:51:50.381:E / AndroidRuntime(12026):在android.os.Looper.loop(Looper.java:137)
02-25 22:51:50.381:E / AndroidRuntime(12026):在android.app.ActivityThread.main(ActivityThread.java:5191)
02-25 22:51:50.381:E / AndroidRuntime(12026):在java.lang.reflect.Method.invokeNative(本机方法)
02-25 22:51:50.381:E / AndroidRuntime(12026):在java.lang.reflect.Method.invoke(Method.java:511)
02-25 22:51:50.381:E / AndroidRuntime(12026):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:795)
02-25 22:51:50.381:E / AndroidRuntime(12026):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
02-25 22:51:50.381:E / AndroidRuntime(12026):在dalvik.system.NativeStart.main(本机方法)


解决方案

当你的 观测 ,你的类继承其所有功能。你并不需要重写它的方法或保留自己的一组观察员除非你的加入自己的功能。由于贝利小号所指出的,在你的setter方法​​,调用之前 notifyOservers(),电话 setChanged()

尝试删除所有你从观测类覆盖的方法。此外,每次调用 notifyObservers(对象),电话 clearChanged()之后。

I've been reading up on the Observer Pattern for keeping my UI up to date but I still can't get it to work, As far as I understand the Observer is my UI and it watches my Pet class for any variable changes if there is any it runs update(); At the minute it does nothing, not even Log.d.

Observer/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;

    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);

        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);
        pet.notifyObservers(pet);


    }

    @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) {
        Toast.makeText(getApplicationContext(), "soemthing has changed", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onClick(View v) {
        if (v == PunchPet) {
            pet.setLVL(50);
            pet.notifyObservers(pet);
            Log.d(TAG, "PUNCHPET" + pet.getHP());

    }else {

    }



    }

}

Observable/Pet

package com.grim.droidchi;

import java.util.Observable;


import android.util.Log;

public class Pet extends Observable implements PetInterface {

    private static final String TAG = "VPET";
    private int Health = 100;

    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 setisAlive(boolean answer) {
        this.isAlive = answer;
    }

    public void setisSick(boolean answer) {
        this.isAlive = answer;
    }

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

    }

}

Yes I've asked this also but as you know, It got two answers (which although they maybe be right don't help me) and won't recieve anymore now it'll dropped too far down the list, If I could delete it I would

Logcat

02-25 22:51:50.381: E/AndroidRuntime(12026): FATAL EXCEPTION: main
02-25 22:51:50.381: E/AndroidRuntime(12026): java.lang.NullPointerException
02-25 22:51:50.381: E/AndroidRuntime(12026):    at com.grim.droidchi.MainActivity.update(MainActivity.java:93)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at java.util.Observable.notifyObservers(Observable.java:138)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at com.grim.droidchi.Pet.setHP(Pet.java:33)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at com.grim.droidchi.MainActivity$1.onClick(MainActivity.java:47)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at android.view.View.performClick(View.java:4202)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at android.view.View$PerformClick.run(View.java:17340)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at android.os.Handler.handleCallback(Handler.java:725)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at android.os.Looper.loop(Looper.java:137)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at android.app.ActivityThread.main(ActivityThread.java:5191)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at java.lang.reflect.Method.invokeNative(Native Method)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at java.lang.reflect.Method.invoke(Method.java:511)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
02-25 22:51:50.381: E/AndroidRuntime(12026):    at dalvik.system.NativeStart.main(Native Method)

解决方案

When you inherit from Observable, your class inherits all of its functionality. You don't need to override its methods or keep your own Set of Observers unless your adding your own functionality. As Bailey S has stated, in your setter methods, before calling notifyOservers(), call setChanged().

Try removing all the methods you've overridden from the Observable class. Also, every time you call notifyObservers(object), call clearChanged() afterwards.

这篇关于观察观测量实施问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆