
我有一个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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)