web-dev-qa-db-ja.com

Androidでハンドラを停止する方法

私のアプリケーションでは、Gridviewを使用してカレンダーを作成し、そのGridviewでImageviewを使用して日付とイベントの一部の可用性を表示しています。これを行うために、ハンドラーを作成しました。

ハンドラーを停止します。

MainActivity.Java

// inside oncreate

Handler handler = new Handler();
refreshCalendar();

// outside oncreate

public void refreshCalendar() { 
    calAdapter.refreshDays();
    calAdapter.notifyDataSetChanged();
    handler.post(calendarUpdater);
    calTitle.setText(Android.text.format.DateFormat.format("MMMM yyyy", cal));
}
public Runnable calendarUpdater = new Runnable() {

    @Override
    public void run() {
        items.clear();
        allData = new ArrayList<HashMap<String,String>>();
        allData.clear();
        allData = db.showAllEvents();

        String currentDate = (String)Android.text.format.DateFormat.format("MM/yyyy", cal);
        for(int i=0; i<allData.size(); i++)
        {
            String date[] = allData.get(i).get("date").split("/");
            String md[] = currentDate.split("/");
            if(date[1].equals(md[0]) && date[2].equals(md[1]))
            {
                items.add(date[0]);
                System.out.println("dates: "+date[0]);
            }
        }
        calAdapter.setItems(items);
        calAdapter.notifyDataSetChanged();
    }
};

このスレッドを無効にする方法と場所を教えてください。

14
Abhishek Dhiman

これを使用してその実行可能を停止できます

_handler.removeCallbacks(calendarUpdater);
_

removeCallbacks(Runnable r):メッセージキューにある_Runnable r_の保留中の投稿を削除します。

編集

このようにコードを整理できます

あなたのonCreate() of _MainActivity.Java_

_Handler handler = new Handler();
refreshCalendar()

//outside  oncreate 

public void refreshCalendar() { 
    calAdapter.refreshDays();
    calAdapter.notifyDataSetChanged();
    startRepeatingTask();
    calTitle.setText(Android.text.format.DateFormat.format("MMMM yyyy", cal));
}

public Runnable calendarUpdater = new Runnable() {

    @Override
    public void run() {
        items.clear();
        allData = new ArrayList<HashMap<String,String>>();
        allData.clear();
        allData = db.showAllEvents();

        String currentDate = (String)Android.text.format.DateFormat.format("MM/yyyy", cal);
        for(int i=0; i<allData.size(); i++)
        {
            String date[] = allData.get(i).get("date").split("/");
            String md[] = currentDate.split("/");
            if(date[1].equals(md[0]) && date[2].equals(md[1]))
            {
                items.add(date[0]);
                System.out.println("dates: "+date[0]);
            }
        }
        calAdapter.setItems(items);
        calAdapter.notifyDataSetChanged();
        handler.postDelayed(calendarUpdater,5000); // 5 seconds
    }
};

void startRepeatingTask()
{
    calendarUpdater.run(); 
}

void stopRepeatingTask()
{
    handler.removeCallbacks(calendarUpdater);
}
_

これで、startRepeatingTask()を呼び出してメッセージを投稿し、stopRepeatingTask()の使用を停止できます。

次のリンクから継承

時間遅延のあるタスクを繰り返しますか?

25
Juned

以下の行を試してください、

handler.removeMessages(0);

メッセージキューにあるコードwhatの保留中のメッセージの投稿をすべて削除します。

12
MuraliGanesan

ハンドラーはstoppedまたはstartedにする必要はありません。これは、メッセージとランナブルをスレッドキューに投稿するための単なるゲートウェイです。あなたのケースでは、ハンドラのスレッドで実行されるRunnableを投稿しています。そのRunnableを停止する必要があります。したがって、そのforループにチェックを入れて、それを壊します。

removeCallbacks(Runnable r)Handlerで使用して、投稿されたRunnableをキャンセルすることもできます。しかし、これはすでに実行されているRunnableを削除しません。

8
S.D.

あなたはこれを試すべきですonStop()

handler.removeCallbacksAndMessages(calendarUpdater);
2
John Wayne

ハンドラーをフィールドにします。次に、アクティビティで、onStopメソッドをオーバーライドし、ハンドラーコールバックメッセージを次のように停止します。

@Override
    protected void onStop() {
        super.onStop();
        handler.removeCallbacks(calendarUpdater);
    }
1