アイテムを表示するリストビューが 1 つあるアクティビティがあります。このアクティビティには、3 つのボタンと、他の複数のボタンを含むメニューがあります。
ボタンを 1 つ押すと、新しいスレッドが起動され、Web サービスからデータが取得され、リストビューが埋められます。次に、リストビューが表示されます。
唯一の問題は、ボタンの 1 つを押すたびに、スレッドを起動することです。データの取得にかかる時間によっては、リストビューに適切なデータが表示されないことがあります (ユーザーが 1 つのスレッドが終了するのを待たずに別のボタンを押した場合)。
最初にスレッドをキャンセルしようとしましたが、機能しません (非同期タスクまたは thread.interrupt を使用)
リストビューが最後のデータで満たされるように、前のスレッドを停止するにはどうすればよいですか?
助けてくれてありがとう :)
// Items to be displayed in the listview
private ArrayList<HashMap<String, Object>> oItems = new ArrayList<HashMap<String, Object>>();
// Launch the thread when toggle is checked
button.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
LoadListView();
}
}
});
oMenu.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
LoadListView();
return true;
}
});
private void LoadListView() {
new Thread(ListViewRunnable).start();
}
private Runnable ListViewRunnable = new Runnable() {
public void run() {
while (GetItems() < 1) {
}
MainHandler.post(new Runnable() {
public void run() {
}
});
}
private int GetItems() {
try {
HashMap<String, Object> oItem;
//Get items from web services
List<ItemFromService> oItemsFromService = GetItemsFromWebService();
for (oItemFromService : oItemsFromService) {
oItem = new HashMap<String, Object>();
oItem.put("ID", oItemFromService.get_iID());
oItem.put("Label", oItemFromService.get_sLabel());
oItems.add(oItem);
}
MainHandler.sendEmptyMessage(GOT_ITEMS);
} catch (Exception e) {
}
return 1;
}
}
private Handler MainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == GOT_ITEMS) {
adapter.notifyDataSetChanged();
}
}
};