【问题标题】:Android: parse query in threadAndroid:在线程中解析查询
【发布时间】:2025-12-04 16:45:02
【问题描述】:

我正在使用 Parse 库从 DB 中查询一些记录,这些记录将显示在带有自定义适配器的 ListView 中。我有一个包含记录的表,每条记录都应该从其他表中进行计数查询。

这是对检索到的每个对象进行计数查询的线程:

getVisualizations = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < events.size(); i++) {
                ParseQuery<ParseObject> query = ParseQuery.getQuery(ParseConstant.PT_VISUALIZ);
                query.whereEqualTo(ParseConstant.PT_VISUALIZ_EVENTO, events.get(i));

                events.get(i).setVisualizations(query.count());
            }
        }
    });

events 是一个对象数组列表

这是main中的代码

ParseQuery<ParseObject> query = ParseQuery.getQuery(ParseConstant.PT_EVENT);
    query.setLimit(30);
    query.findInBackground(new FindCallback<ParseObject>() {
        public void done(List<ParseObject> resultList, ParseException e) {
            if (e == null) {

                events = new ArrayList<Event>();

                for (int i = 0; i < resultList.size(); i++) {
                    Event event = (Event) resultList.get(i);

                    events.add(event);
                }

                if (!getVisualizations.isAlive()) {

                    getVisualizations.start();

                }

                if (adapter != null) {
                    adapter.notifyDataSetChanged();
                } else {
                    adapter = new AdapterEvent(getActivity(), R.layout.list_event, events, list);
                    AnimationAdapter animAdapter = new SwingBottomInAnimationAdapter(adapter);
                    animAdapter.setAbsListView(list);
                    list.setAdapter(animAdapter);
                }

                loadingBar.setVisibility(View.INVISIBLE);

            } else {
                Log.d("score", "Error: " + e.getMessage());
            }
        }
    });

问题是线程启动后,我不知道如何阻塞主线程,直到另一个线程完成。 (对不起英语:/)

【问题讨论】:

  • 我推荐你使用类 AsyncTask 来做线程处理。而且主线程不应该被阻塞,因为是UI线程。

标签: android multithreading wait main synchronized


【解决方案1】:

也许您应该使用 Thread.join() - 如果我们正在处理 2 个线程,这将阻塞一个线程,同时允许另一个线程完成,然后一旦完成,它将恢复。这是一个tutorial

【讨论】: