java–Asynctask ArrayList对象没有从doInBackground传递给onPostExecute

java–Asynctask ArrayList对象没有从doInBackground传递给onPostExecute,第1张

概述我有一个AsyncTask接受上下文(使用onPostExecute)并运行doInBackground以从服务器返回对象的ArrayList.当我执行此 *** 作时,我可以看到doInBackground运行正常,但是它没有将结果传递给onPostExecute.经过多次搜索,我还没有找到如何在AsyncTask中返回对象的ArrayList的答案.这是我在

我有一个AsyncTask接受上下文(使用onPostExecute)并运行doInBackground以从服务器返回对象的ArrayList.当我执行此 *** 作时,我可以看到doInBackground运行正常,但是它没有将结果传递给onPostExecute.

经过多次搜索,我还没有找到如何在AsyncTask中返回对象的ArrayList的答案.

这是我在doInBackground中创建并使用onPostExecute的对象:

public class ServerTimeCard {    public String eventnameinput;    Boolean isLocation, isImage, isVoice;    public ServerTimeCard(String eventnameinput, boolean isLocation, boolean isImage, boolean isVoice) {        this.eventnameinput = eventnameinput;        this.isLocation = isLocation;        this.isImage = isImage;        this.isVoice = isVoice;    }}

我正在使用新的LoadFrIEndCards(context)执行AsyncTask .execute();在onCreate.

>预期输出:doInBackground应该将一个ArrayList返回给onPostExecute
>当前输出:ArrayList< ServerTimeCard>当doInBackground中的相同arrayList具有更大的大小时,onPostExecute的大小为零.

以下是AsyncTask代码.

public class LoadFrIEndCards extends AsyncTask<VoID, VoID, ArrayList<ServerTimeCard>> {            Context context;            ArrayList<ServerTimeCard> result;            public LoadFrIEndCards(Context context) {                this.context = context;            }            @OverrIDe            protected ArrayList<ServerTimeCard> doInBackground(VoID... voIDs) {                     result = new ArrayList<ServerTimeCard>();                     // ...a bunch of data retrIEval goes on here...                         // querying parse for object info                     // adding a new object to the local ArrayList for all in db                     for (String frIEnd : frIEndsListnames) {                          Parsequery<ParSEObject> query = Parsequery.getquery("TestObject");                          query.whereEqualTo("accountname", frIEnd+"@gmail.com");                          query.findInBackground(new FindCallback<ParSEObject>() {                          public voID done(List<ParSEObject> objects, ParseException e) {                          if (e == null) {                               for (ParSEObject cardInfo : objects) {                                   ServerTimeCard item = new ServerTimeCard(                                      cardInfo.getString("eventname"),                                      cardInfo.getBoolean("isImage"),                                      cardInfo.getBoolean("isImage"),                                      cardInfo.getBoolean("isVoice"));                                   result.add(item);                        Log.e("New item called: ", String.valueOf(item.eventnameinput));                        Log.e("New size of array...", String.valueOf(result.size()));                    }                } else {                    Log.d("info", "Error: " + e.getMessage());                }            }        });    }                // returning the new ArrayList<ServerTimeCard> to onPostExecute                // PROBLEM: THE SIZE OF THE RESulT IS 0                Log.e("Size of passing array", String.valueOf(result.size()));                return result;            }            @OverrIDe            protected voID onPostExecute(ArrayList<ServerTimeCard> result) {                // PROBLEM: This returns 0                Log.e("Data List size: ", String.valueOf(result.size()));                 // trying to use all objects in the arrayList here but it doesn't work                // due to the size. Something isn't passing correctly.            }        }

Log.e的Logcat输出:(看起来它调用doInBackground,然后是onPostExecute,然后再次调用doInBackground)

E/Size of passing array﹕ 0E/Data List size:﹕ 0E/New item called:﹕ yahE/New size of array...﹕ 1E/New item called:﹕ lplokololE/New size of array...﹕ 2E/New item called:﹕ It worksE/New size of array...﹕ 3

解决:我原本以为我需要AsyncTask但我最终删除了所有代码并将所有代码丢入我的Main类中的方法.我在asynctask中同时运行了太多的东西,结构是在整个地方抛出数据.获得的经验教训:保持简单.

解决方法:

您的问题是您使用findInBackground进行查询.该方法在后台线程中完成.因此,您基本上在异步任务中运行异步任务.

> doInBackground
> findInBackground – >异步运行,因此代码执行继续
>在查询完成之前调用onPostExecute.
>然后调用完成的回调以使您的查询填满您的列表

因此,您需要做的是在AsyncTask之外使用findInBackground(该方法不打算在AsyncTask中使用)或使用find函数.

总结

以上是内存溢出为你收集整理的java – Asynctask ArrayList对象没有从doInBackground传递给onPostExecute全部内容,希望文章能够帮你解决java – Asynctask ArrayList对象没有从doInBackground传递给onPostExecute所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1117955.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存