2010-06-06 86 views
41

我需要設置一個簡單的事件偵聽器來偶爾刷新ListView。問題是我不知道我怎麼能產生一個事件。Android應用上的自定義事件偵聽器

我知道,對於按鍵或按鈕按下的事件,我只需要實現Handler。但在這個特定情況下,我實際上需要生成事件,每當我的應用程序的另一個正在運行的線程醒來並刷新其RSS源的新聞列表時,就會觸發該事件。

我已經做了所有事情,但陷入了這裏。我可以得到任何建議或鏈接關於如何實現這一點的更多信息?

回答

88
  1. 定義一個回調接口

     public interface NewsUpdateListener 
         { 
          void onNewsUpdate(<News data to be passed>); 
         } 
    
  2. 提供一個註冊設施在獲取RSS fe的後臺線程上ED

    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. 消防回調,初始化

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

您可以詳細說明在哪裏放置不同的片段? – Sulby 2015-06-11 07:23:01

+0

@ FireFly3000:我_think_代碼片段2是一個java類,您希望有一個事件,代碼片段1可以在一個單獨的文件中,或者是一個2的子類。代碼片段3應該是片段2的成員。代碼片段4進入希望聽課的班級。 – 2015-06-28 21:43:31

+0

感謝Awesome解決方案。什麼時候註銷聽衆?由於您每次都將偵聽器添加到arrayList中,您何時會刪除偵聽器? – 2015-07-16 08:15:08

3

這聽起來像你需要一個處理程序 - (詳細查找android.os.Handler)。

sendMessageDelayed方法將允許您安排消息何時發送到您的處理程序。

快速搜索拉昇一個完整的例子,應該讓你開始:http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html

+3

這不是最好的方法,有很多情況需要在偵聽器端立即做出反應,並且sendMessageDelayed/Handlers會添加不必要的延遲。最好的方法是創建一個列表器接口,並根據下面的Sameer示例來保存一組監聽器。 – radhoo 2012-07-24 11:27:03

27

試試這個:

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); 
    } 
} 
+3

這種方法具有簡單性優勢,但Sameer的答案允許爲一個給定的事件設置多於一個聽衆,這是我通常推薦的解決方案。 – radhoo 2012-07-24 11:25:08

+0

謝謝,它爲我工作。簡單而優雅 – 2013-06-28 16:36:04

2

您可以使用android life cycle對於新聞請訪問

.... 
for (listener : listeners) 
{ 
    listener.onNewsUpdate(<News data to be passed>); 
} 
.... 
  • 註冊監聽的地方。

    創建一個信號接口,又名您的活動

    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生命週期的作者。

  • +0

    這個很有趣 – 2016-05-11 21:55:01

    +0

    @DanielCardenas tnx,現在它實際上更簡單了(你只需要爲你的事件創建一個接口),我更新了答案以使用最新版本的生命週期 – 2016-05-12 05:42:57

    相關問題