2013-02-25 42 views
9

EDIT vui lòng xem Observer Observables implementing issue - Có vẻ như tôi đã ghi đè các phương thức không cần thiết và không gọi setChanged(); trước khi thông báo();Quan sát/Quan sát Android

Tôi đã đọc lên trên Mẫu quan sát để giữ giao diện người dùng của tôi được cập nhật nhưng tôi vẫn không thể thấy việc sử dụng nó .. Ngay cả khi đối tượng cụ thể của tôi thông báo cho MainActivity của tôi, sau đó chạy bản cập nhật(); phương pháp tôi vẫn sẽ không thể sử dụng đối tượng Pet để kéo các giá trị cập nhật khi đối tượng được tạo trong Oncreate ... và tôi không thể tạo đối tượng mới vì sau đó các biến sẽ khác .. đây là của tôi thực hiện và nó dường như không hoạt động.

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

    } 



    } 

} 

Quan sát/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() { 

    } 

} 
+2

Tôi nghĩ bạn nên có một cái nhìn tại địa chỉ: http://www.youtube.com/watch? v = wiQdrH2YpT4 –

Trả lời

3

Trước tiên, tôi sẽ không đề xuất ghi đè addObserver hoặc removeObserver trong đối tượng quan sát được của bạn. API thực hiện một công việc thực sự tốt để thực hiện điều này (trừ khi bạn muốn một số chức năng cụ thể).

Thứ hai, phương pháp notifyObservers() bị quá tải để bạn có thể truyền cho đối tượng, IE notifyObservers(Object obj). Nếu bạn vượt qua nó Pet, notifyObservers(this), thì bạn sẽ có một tham chiếu đến đối tượng Pet đang được quan sát.

Tôi nghĩ đây là câu hỏi của bạn nhưng hãy sửa tôi nếu tôi sai.

EDIT: Để làm rõ, câu trả lời của tôi phụ thuộc vào bạn sử dụng lớp Observable trong Java API here.

Sau khi xem xét thêm, bạn nên đã có một tham chiếu đến đối tượng Pet mà gọi là update phương pháp của Observer

+1

Xem đó là vấn đề tôi nghĩ, khi tôi đã đặt câu hỏi trước đây tôi vừa mới ném mã vào ví dụ. Tôi đã nói rằng tôi sẽ cần phải thực hiện một giao diện quan sát của riêng tôi mà tôi không thể hiểu tại sao kể từ khi tôi biết tôi đã viết các tập tin tôi biết nó không có gì ... đây là giao diện quan sát của tôi .. 'package com .grim.droidchi; nhập khẩu java.util.Observer; giao diện công cộng Có thể quan sát { \t \t công cụ bổ trợ void công cộng (Observer o); \t public void removeObserver (Observer o); \t thông báo void công khaiThông báo viên (Observer o); } ' – Pheonix2105

+0

API java có một lớp quan sát được đặt tại đây: http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Observable.html. Tôi sẽ khuyên bạn nên mở rộng lớp này trái ngược với việc viết giải pháp trồng tại nhà của riêng bạn.Tôi nhận ra những người khác có thể không đồng ý với cách tiếp cận này vì nó đòi hỏi bạn phải vượt qua các đối tượng và làm 'instanceof' tuy nhiên tôi nghĩ nó có thể đáp ứng yêu cầu của bạn – nattyddubbs

+0

Không có khả năng mở rộng, tôi phải tạo giao diện của riêng mình hoặc nó chỉ nói" Không thể giải quyết được quan sát đối với loại " – Pheonix2105

1

bạn pet không thể truy cập vào các phương pháp khác vì nó không được định nghĩa ở cấp độ toàn cầu.

Bạn nên xác định Pet pet = new Renamon(); bên ngoài phương thức onCreate.

Các vấn đề liên quan