2012-03-19 8 views

答えて

2

はい、あなたがバックグラウンドでそれを行うと、直接GUIを更新するか、Observerパターンを注入することにより、いずれかのあなたの活動への更新をプッシュすることができます。

私は今あなたを助けるかもしれない完全に動作する例を持っています。 [OK]を最初に、このような何か観測クラスを作成します。

public class MyObservable extends Observable { 

    int n = 0; 

    public void setValue(int n) { 
     setChanged(); 
     notifyObservers(n); 
    } 

    public int getValue() 
    { 
     return n; 
    } 
} 

を、タスクを作成し、あなたがあなたをパラメータ修正する必要があり、私は怠け者:)

public class MyTask extends AsyncTask 
{ 
    MyObservable observable; 
    int numberOfNotifications = 0; 

    @Override 
    protected Object doInBackground(Object... params) { 
     try { 
      this.observable = (MyObservable) params[0];   
      while (true) { 
       numberOfNotifications++; 
       int timeSinceLastUpdate = 1000*5; 
       Thread.sleep(timeSinceLastUpdate); 
       publishProgress(numberOfNotifications); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Object... values) {  
     observable.setValue((Integer) values[0]); 
    } 
} 

その後は、アプリケーションを拡張することができますクラスとそこにスレッドを起動します。ここで注意すべき

public class StackApplication extends Application { 

    private static MyObservable myObservable; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     myObservable = new MyObservable(); 
     new MyTask().execute(myObservable); 
    } 

    public static MyObservable getObservable() { 
     return myObservable; 
    } 

} 

ことの一つは、あなただけの観察可能の1つのインスタンスを取得することを確認するためにsingeltonパターンです。 はその後、それはあなたの関連する活動にオブザーバーを実装するためにケーキの一部です:

public class FirstActivity extends Activity implements Observer { 

    TextView tvCounter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tvCounter = (TextView) findViewById(R.id.hello); 

     StackApplication.getObservable().addObserver(this); 
    } 

    @Override 
    public void update(Observable observable, Object data) { 
     int i = (Integer) data; 
     tvCounter.setText(Integer.toString(i)); 
    } 
} 

これは動作するはずですし、あなたが別の活動でこのパターンを使用するように習慣場合だけオブザーバーを追加し、更新メソッドをオーバーライドすることを忘れないでください。あなたがそれを動作させるか、この例を使用していくつかの問題がある場合は、コメントしてください。

+0

ここでは、1つのタイマーで4つのアクティビティを制御できます。つまり、すべての4つのアクティビティに共通のタイマーでデータをロードすることができます。 –

+0

はい、4つのアクティビティにObserverを実装したり、4つのアクティビティを直接更新したりできます。私はObserverのために私の自己必要性のための例を行くだろうか? – DNRN

+0

ya私は正しく実装するための例が必要です...多くのお礼 –

関連する問題