0

我有一个显示项目的列表视图的活动。这个活动有三个按钮和一个带有多个其他按钮的菜单。

当我按下一个按钮时,会启动一个新线程,从 Web 服务获取数据,填充列表视图。然后显示列表视图。

唯一的问题是每次我按下一个按钮时,我都会启动一个线程。根据检索数据所需的时间,有时列表视图未填充好的数据(用户不等待一个线程完成并按下另一个按钮)

首先,我尝试取消线程,但它不起作用(异步任务或使用 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

您可以使用 Thread 类而不是 AsyncTask。实例化 Thread 并维护它的句柄。利用:

hThread.interrupt()

向线程发送中断消息,并在线程内部进行测试:

if (isInterrupted())
 return;

离开线程。

于 2012-07-13T14:26:56.690 回答
0

在获得完整的所需数据之前,不要使用adaptername.notifyDataSetChanged()方法,这样适配器的适配器ListView不会得到更新,旧数据会被持久化。

于 2012-07-13T12:34:50.063 回答