15

私のアプリケーションでは、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();
    }
};

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

4

5 に答える 5

26

これを使用して、そのランナブルを停止できます

handler.removeCallbacks(calendarUpdater);

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

編集

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

あなたonCreate()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()

以下のリンクから継承

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

于 2013-01-28T07:29:57.917 に答える
12

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

handler.removeMessages(0);

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

于 2013-01-28T07:30:14.987 に答える
9

ハンドラーには、停止または開始するものは何もありません。Messages と Runnables をスレッド Queue に投稿するための単なるゲートウェイです。あなたの場合、Handler のスレッドで実行される Runnable を投稿しています。その Runnable を停止する必要があります。だから、そのforループにチェックを入れてそれを壊してください。

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

于 2013-01-28T07:29:27.157 に答える