私のアプリケーションでは、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();
}
};
このスレッドを無効にする方法と場所を教えてください。
これを使用してその実行可能を停止できます
_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()
の使用を停止できます。
次のリンクから継承
以下の行を試してください、
handler.removeMessages(0);
メッセージキューにあるコードwhat
の保留中のメッセージの投稿をすべて削除します。
ハンドラーはstoppedまたはstartedにする必要はありません。これは、メッセージとランナブルをスレッドキューに投稿するための単なるゲートウェイです。あなたのケースでは、ハンドラのスレッドで実行されるRunnableを投稿しています。そのRunnableを停止する必要があります。したがって、そのfor
ループにチェックを入れて、それを壊します。
removeCallbacks(Runnable r)
をHandler
で使用して、投稿されたRunnable
をキャンセルすることもできます。しかし、これはすでに実行されているRunnable
を削除しません。
あなたはこれを試すべきですonStop()
:
handler.removeCallbacksAndMessages(calendarUpdater);
ハンドラーをフィールドにします。次に、アクティビティで、onStopメソッドをオーバーライドし、ハンドラーコールバックメッセージを次のように停止します。
@Override
protected void onStop() {
super.onStop();
handler.removeCallbacks(calendarUpdater);
}