安卓线程/回调

标签 android multithreading

我正在尝试创建一个对象列表(在我的示例中为 List<Card>),我在其中使用 json 将对象添加到此列表,但该列表仍为空。这是我的代码:

public List<Card> readCardsFromJson() {
        final List<Card> cards = new ArrayList<Card>();

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                HttpReader httpReader = new HttpReader();
                httpReader.setOnResultReadyListener(new HttpReader.OnResultReadyListener() {
                            @Override
                            public void resultReady(String result) {
                                    //Add Card objects to the List<Card>
                                }
                            }
                        });
                httpReader.execute("http://eduphp.khk.be/~r0370877/EnkelExpert.json");
            }
        });
        thread.start();

        return cards;
    }

问题是我返回的列表是空的。我很确定这是一个问题,因为我在这里使用的线程。我认为返回发生在线程实际完成之前,但我该怎么做才能解决这个问题?

我似乎无法解决这个问题。任何帮助将不胜感激。

最佳答案

你应该返回一个 Future<List<Card>>这是非阻塞的,允许您在处理 HTTP 请求时继续计算:

ExecutorService es = Executors.newSingleThreadExecutor();
Future<List<Card>> futureCards = es.submit(new Callable<List<Card>>() {
    @Override
    public List<Card> call() {
        return readCards();
    }
});
// do some other work ...
// ... and at some point need the List<Card>
List<Card> cards = futureCards.get(); // blocks until the future is completed

和阻塞readCards方法:

private List<Card> readCards() {
    final List<Card> cards = new ArrayList<Card>();
    HttpReader hr = new HttpReader();
    hr.setOnResultReadyListener(new HttpReader.OnResultReadyListener() {
        @Override
        public void resultReady(String result) {
            //Add Card objects to the List<Card>
        }
    });
    hr.execute("http://eduphp.khk.be/~r0370877/EnkelExpert.json");
    return cards;
}

关于安卓线程/回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27743864/

相关文章:

java - OpenCV 寻找轮廓的角点

java - android edittext文本观察器格式电话号码,如xxx-xxx-xx-xx

c++ - 在不使用 pthread_join 的情况下等待 pthread_create 完成

java - 使用两个线程按顺序使用自定义锁定打印编号,其中一个线程打印偶数,另一个线程打印奇数

c# - System.Timers.Timer Elapsed 在使用 Task.Run with async from Console App 时间歇性地不触发

android - 我可以管理生命周期所有者,用 Koin 注入(inject) viewModel 吗?

c# - 在 Xamarin Forms 中更改 BindableProperty 时不调用自定义控件 OnElementChanged

java - java servlet 中多个线程访问的变量是否需要声明为 volatile?

python - python numpy数组操作+=线程安全吗?

android - 如何在软键盘上添加菜单按钮