我需要設置一個簡單的事件偵聽器來偶爾刷新ListView
。問題是我不知道我怎麼能產生一個事件。Android應用上的自定義事件偵聽器
我知道,對於按鍵或按鈕按下的事件,我只需要實現Handler
。但在這個特定情況下,我實際上需要生成事件,每當我的應用程序的另一個正在運行的線程醒來並刷新其RSS源的新聞列表時,就會觸發該事件。
我已經做了所有事情,但陷入了這裏。我可以得到任何建議或鏈接關於如何實現這一點的更多信息?
我需要設置一個簡單的事件偵聽器來偶爾刷新ListView
。問題是我不知道我怎麼能產生一個事件。Android應用上的自定義事件偵聽器
我知道,對於按鍵或按鈕按下的事件,我只需要實現Handler
。但在這個特定情況下,我實際上需要生成事件,每當我的應用程序的另一個正在運行的線程醒來並刷新其RSS源的新聞列表時,就會觸發該事件。
我已經做了所有事情,但陷入了這裏。我可以得到任何建議或鏈接關於如何實現這一點的更多信息?
定義一個回調接口
public interface NewsUpdateListener
{
void onNewsUpdate(<News data to be passed>);
}
提供一個註冊設施在獲取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);
}
....
}
消防回調,初始化
期間....
<class <Background processing class object>.registerListener
(
new OnNewsUpdateListener() {
onNewsUpdate(<News Data>) {
// process news data
runOnUIThread(new Runnable() {
public void run() {
// refresh list view
}
}
}
}
....
這聽起來像你需要一個處理程序 - (詳細查找android.os.Handler)。
sendMessageDelayed方法將允許您安排消息何時發送到您的處理程序。
快速搜索拉昇一個完整的例子,應該讓你開始:http://www.tutorialforandroid.com/2009/01/using-handler-in-android.html
這不是最好的方法,有很多情況需要在偵聽器端立即做出反應,並且sendMessageDelayed/Handlers會添加不必要的延遲。最好的方法是創建一個列表器接口,並根據下面的Sameer示例來保存一組監聽器。 – radhoo 2012-07-24 11:27:03
試試這個:
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);
}
}
這種方法具有簡單性優勢,但Sameer的答案允許爲一個給定的事件設置多於一個聽衆,這是我通常推薦的解決方案。 – radhoo 2012-07-24 11:25:08
謝謝,它爲我工作。簡單而優雅 – 2013-06-28 16:36:04
您可以使用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生命週期的作者。
這個很有趣 – 2016-05-11 21:55:01
@DanielCardenas tnx,現在它實際上更簡單了(你只需要爲你的事件創建一個接口),我更新了答案以使用最新版本的生命週期 – 2016-05-12 05:42:57
您可以詳細說明在哪裏放置不同的片段? – Sulby 2015-06-11 07:23:01
@ FireFly3000:我_think_代碼片段2是一個java類,您希望有一個事件,代碼片段1可以在一個單獨的文件中,或者是一個2的子類。代碼片段3應該是片段2的成員。代碼片段4進入希望聽課的班級。 – 2015-06-28 21:43:31
感謝Awesome解決方案。什麼時候註銷聽衆?由於您每次都將偵聽器添加到arrayList中,您何時會刪除偵聽器? – 2015-07-16 08:15:08