简体   繁体   English

Android / Java asyncTask等待

[英]Android/Java asyncTask wait

I can't find a solution on here so I am going to ask it. 我在这里找不到解决方案,所以我要提出解决方案。 I am building an Android(5.0) app. 我正在构建一个Android(5.0)应用程序。 It is going to be a dutch news reader, but i am stuck on the part where it is retrieving the news items. 这将是荷兰新闻阅读器,但是我被困在检索新闻的那部分。 In the center of te code, the list results gets filled with the items. 在代码的中心,列表结果将充满项目。 It shows the results in the Log, but the task says it ended before the list got filled. 它在日志中显示结果,但是任务说它在列表被填满之前就结束了。 Anyone? 任何人? Been stuck on this for 4 hours. 被卡在这四个小时。 It should wait until the "service.GetNewsItems(cb);" 它应该等到“ service.GetNewsItems(cb);”为止。 is finished. 完成。

Code: 码:

    public class GetNewsAsync extends AsyncTask<String, String, String> {

        public List<Result> results = new ArrayList<Result>();
        private RestAdapter restAdapter;
        public RootObject rootObject = new RootObject();
        public MainActivity ma;
        static final String API_URL = SECRETAPILINK

            @Override
            protected String doInBackground(String... params) {
                OkHttpClient mOkHttpClient = new OkHttpClient();
                mOkHttpClient.setConnectTimeout(15000, TimeUnit.MILLISECONDS);
                mOkHttpClient.setReadTimeout(15000, TimeUnit.MILLISECONDS);
                restAdapter = new RestAdapter.Builder().setEndpoint(API_URL).setClient(new OkClient(mOkHttpClient)).setLogLevel(RestAdapter.LogLevel.FULL) .build();
                GetNewsService service = restAdapter.create(GetNewsService.class);

                Callback<RootObject> cb = new Callback<RootObject>() {
                    @Override
                    public void success(RootObject responseObject, Response response) {
                        results.addAll(responseObject.results);
                        for (int i = 0; i< results.size();i++){
                            Log.v("AASSAA", "DSFSDFHE");
                        }
                    }

                    @Override
                    public void failure(RetrofitError error) {
                        Log.v("AASSAA", error.toString());
                    }
                };
                service.GetNewsItems(cb);
                Log.v("AASSAASIZER", String.valueOf(results.size()));
                return "Done";
            }

            @Override
            protected void onPostExecute(String result) {

            }
            @Override
            protected void onPreExecute() {

            }

            @Override
            protected void onProgressUpdate(String... text) {

            }
            public List<Result> GetList(){
                return results;
            }
        }

You are creating a AsyncTask, and inside the AsyncTask, you're creating ANOTHER thread (Retrofit does this). 您正在创建一个AsyncTask,并在AsyncTask内创建一个ANOTHER线程(Retrofit会执行此操作)。

This is why your code is screwed up. 这就是为什么您的代码搞砸了。
service.GetNewsItems(cb) is async, so when you return from your AsyncTask, the Retrofit call is not done yet, and therefore your data is not ready yet. service.GetNewsItems(cb)是异步的,因此当您从AsyncTask返回时,Retrofit调用尚未完成,因此您的数据尚未准备好。

You should either use Retrofit alone, or AsyncTask alone. 您应该单独使用Retrofit或单独使用AsyncTask。 Never mix them. 切勿混合。 There are a million guides to Retrofit (both version 1.9 and 2.0-beta) on the internet, so just google it. 互联网上有上百万的翻新指南(版本1.9和2.0-beta),因此只需在Google上进行搜索即可。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM