0

アイテムを表示するリストビューが 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();
            }
        }
    };
4

2 に答える 2

0

完全な必要なデータを取得するまで、メソッドを使用しないでください。adaptername.notifyDataSetChanged()これにより、アダプタがListView更新されず、古いデータが永続化されます。

于 2012-07-13T12:34:50.063 に答える
0

AsyncTask の代わりに Thread クラスを使用できます。スレッドをインスタンス化し、そのハンドルを維持します。使用する:

hThread.interrupt()

スレッドに割り込みメッセージを送信し、スレッド内で次をテストします。

if (isInterrupted())
 return;

スレッドを離れること。

于 2012-07-13T14:26:56.690 に答える