web-dev-qa-db-ja.com

Androidアプリのカスタムイベントリスナー

ListViewを時々更新するために、単純なイベントリスナーを設定する必要があります。問題は、イベントを生成する方法がわからないことです。

キーやボタンを押すなどのイベントには、Handlerを実装するだけでよいことを知っています。しかし、この特定のケースでは、実際にイベントを生成する必要があります。このイベントは、アプリの実行中の別のスレッドが起動し、RSSフィードからのニュースのリストを更新するたびに発生します。

私はすべてをしましたが、ここで立ち往生しました。これを実装する方法についての提案やリンクを入手できますか?

42
Bilthon
  1. コールバックインターフェイスを定義する

            public interface NewsUpdateListener 
            {
                void onNewsUpdate(<News data to be passed>);
            }
    
  2. RSSフィードを取得するバックグラウンドスレッドで登録機能を提供する

        class <Background processing class name> 
        {
        ....
            ArrayList<NewsUpdateListener> listeners = new ArrayList<NewsUpdateListener> ();
        .... 
            public void setOnNewsUpdateListener (NewsUpdateListener listener) 
            {
                // Store the listener object
                this.listeners.add(listener);
            }
        ....
        }
    
  3. ニュースが利用可能になったときにコールバックを起動します

    ....
    for (listener : listeners) 
    {
        listener.onNewsUpdate(<News data to be passed>);
    }
    ....
    
  4. 初期化中にリスナーをどこかに登録します

    ....
        <class <Background processing class object>.registerListener
    (
        new OnNewsUpdateListener() {
            onNewsUpdate(<News Data>) {
                // process news data
                runOnUIThread(new Runnable() {
                    public void run() {
                        // refresh list view
                    }
                }
            }
    }
    ....
    
90
Sameer

これを試して:

interface MyHandlerInterface
{
   void onHandle(Object obj)
}
class myListClass
{
   MyHandlerInterface myHandler;
   public void setHandlerListener(MyHandlerInterface listener)
   {
      myHandler=listener;
   }
   protected void myEventFired(myObj)
   {
      if(myHandler!=null)
         myHandler.onHandle(myObj);
   }
}
28
Hojjat
3
Colin Stewart

そのために Androidライフサイクル を使用できます。

イベントとも呼ばれるシグナルインターフェイスを作成する

interface NewsUpdateSignal{
    void newsUpdateHandler(Mydata data);
}

アクティビティ内または他の任意の場所に登録するよりも、同じSignalに多くのリスナーがいる可能性があります。

class MyActivity extends Activity implements NewsUpdateSignal{
    Signal<NewsUpateSignal> newsUpdateSignal = SignalsBag.inject(NewsUpateSignal.class);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        newsUpdateSignal.addListener(this);        
    }

    @Override
    public void newsUpdateHandler(final Mydata data){
           //Do something here 
    }
}

必要なときに、必要な場所から信号を送信します。

Class A{
    Signal<NewsUpateSignal> newsUpdateSignal = SignalsBag.inject(NewsUpateSignal.class);

    void execute(){
        // obtain the data somehow, and dispatch it, the callback will be invoked on the same thread
        newsUpdateSignal.dispatcher.newsUpdateHandler(data);
    }        
}

免責事項:私はAndroidライフサイクルの著者です。

2
Ilya Gazman