我正试图在启动画面期间从Parse.com检索我的数据。
我在DoInBackground方法中进行查询,并添加在对象向量中检索到的所有对象(在另一个类中)。
当转移到MainActivty时,所有数据都会丢失。
这是我的代码:
private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{
@Override
protected Vector<PartyObj> doInBackground(Void... params)
{
ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> mNameList, ParseException e) {
if (e == null) {
adapter.partyVector = new Vector<PartyObj>();
for(int i=0; i<mNameList.size(); i++){
PartyObject party = new PartyObject();
party.setIndex(i);
party.setmName(mNameList.get(i).getString("Name").toString());
adapter.partyVector.add(party);
}
}else {
Log.d("mNameList", "Error: " + e.getMessage());
}
}
});
return adpater.partyVector;
}
@Override
protected void onPostExecute(Vector<PartyObj> result) {
progressDialog.dismiss();
setContentView(R.layout.activity_main_menu);
}
}
答案 0 :(得分:0)
好像你使用AsyncTask都错了。 query.findInBackground()就我所说的异步调用而言,所以你实际上是在另一个异步调用中包含一个异步调用。这个问题是在query.findInBackground()之后代码执行立即继续,从而结束了doInBackground()方法。由于在异步任务完成后立即移动到主活动,可能是query.findInBackground()尚未完成(因此导致空/部分列表)。
你真的确定需要在异步调用中包装所有内容吗?是
ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");
需要时间来执行,还是已经在异步findInBackground()调用中的大部分工作?如果是这样,我会说跳过AsyncTask并在FindCallback的done()方法中进行视图转换。
更新:我已阅读ParseQuery,并清楚地说:
通常首选使用回调方法,因为网络 操作不会阻塞调用线程。但是,在某些情况下呢 可能更容易使用查找,获取或计数调用,这会阻止 调用线程。例如,如果您的应用程序已经生成了一个 后台任务执行工作,后台任务可以使用 阻止调用并避免回调的代码复杂性。
在findInBackground()中,它明确指出:
从中检索满足此查询的ParseObjects列表 服务器在后台线程。这比使用find()更好 除非你的代码已经在后台线程中运行。
由于您已经将所有内容包装在AsyncTask中,因此您应该完全跳过异步任务,因为findInBackground(已经在后台线程中运行或切换到阻塞find()方法。
没有AsyncTask但使用异步findInBackground()的示例:
ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");
query.findInBackground(new FindCallback() {
@Override
public void done(List<ParseObject> mNameList, ParseException e) {
if (e == null) {
adapter.partyVector = new Vector<PartyObj>();
for(int i=0; i<mNameList.size(); i++){
PartyObject party = new PartyObject();
party.setIndex(i);
party.setmName(mNameList.get(i).getString("Name").toString());
adapter.partyVector.add(party);
}
progressDialog.dismiss();
setContentView(R.layout.activity_main_menu);
}
else {
Log.d("mNameList", "Error: " + e.getMessage());
}
}
});
使用AsyncTask并阻止find()
的示例private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{
@Override
protected Vector<PartyObj> doInBackground(Void... params)
{
ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");
Vector<PartyObject> v = new Vector<PartyObject();
try {
List<ParseObject> queryResult = query.find();
for(ParseObject po : queryResult) {
PartyObject party = new PartyObject();
party.setIndex(partyVector.size());
party.setmName(po.getString("Name").toString());
v.add(party);
}
}
catch(ParseException e) {
Log.d("mNameList", "Error: " + e.getMessage());
}
return v;
}
@Override
protected void onPostExecute(Vector<PartyObj> result) {
adapter.partyVector.addAll(result);
progressDialog.dismiss();
setContentView(R.layout.activity_main_menu);
}
}
答案 1 :(得分:0)
我已经实现了类似的异步类来获取解析服务器数据
private class Getneworders_list extends AsyncTask<Void, Void, List<ParseObject>> {
ArrayList<HashMap<String, String>> neworders_hashmap;
@Override
protected void onPreExecute() {
super.onPreExecute();
neworders_recyclerView.getRecycledViewPool().clear();
}
@Override
protected List<ParseObject> doInBackground(Void... params) {
// Create the array
try {
ParseQuery<ParseObject> query = ParseQuery.getQuery("Orders");
ParseObject obj = ParseObject.createWithoutData("ShopLocations", idd);
query.whereEqualTo("shop", obj);
query.whereEqualTo("orderStatus",0);
query.setCachePolicy(ParseQuery.CachePolicy.IGNORE_CACHE);
query.orderByDescending("updatedAt");
object11 = query.find();
} catch (ParseException e) {
Log.d("Error", e.getMessage());
e.printStackTrace();
}
return object11;
}
@Override
protected void onPostExecute(List<ParseObject> result) {
neworders_hashmap = new ArrayList<HashMap<String, String>>();
if(result != null) {
if (result.size() > 0) {
chec(result.size());
m_Runnable.run();
}
}
}
}
用尽一个