ListView
を時々更新するために、単純なイベントリスナーを設定する必要があります。問題は、イベントを生成する方法がわからないことです。
キーやボタンを押すなどのイベントには、Handler
を実装するだけでよいことを知っています。しかし、この特定のケースでは、実際にイベントを生成する必要があります。このイベントは、アプリの実行中の別のスレッドが起動し、RSSフィードからのニュースのリストを更新するたびに発生します。
私はすべてをしましたが、ここで立ち往生しました。これを実装する方法についての提案やリンクを入手できますか?
コールバックインターフェイスを定義する
public interface NewsUpdateListener
{
void onNewsUpdate(<News data to be passed>);
}
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);
}
....
}
ニュースが利用可能になったときにコールバックを起動します
....
for (listener : listeners)
{
listener.onNewsUpdate(<News data to be passed>);
}
....
初期化中にリスナーをどこかに登録します
....
<class <Background processing class object>.registerListener
(
new OnNewsUpdateListener() {
onNewsUpdate(<News Data>) {
// process news data
runOnUIThread(new Runnable() {
public void run() {
// refresh list view
}
}
}
}
....
これを試して:
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);
}
}
ハンドラが必要なようです 詳細については、Android.os.Handlerを検索してください)。
SendMessageDelayedメソッドを使用すると、メッセージがハンドラーに送信されるタイミングをスケジュールできます。
クイック検索により、すぐに使用を開始できる完全な例が見つかりました:---(http://www.tutorialforandroid.com/2009/01/using-handler-in-Android.html
そのために 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ライフサイクルの著者です。