parse.com调用.save()会导致所有查询停止运行Android

时间:2014-07-08 17:05:11

标签: android database android-asynctask parse-platform

我有两个对象,一个属于可以投票的交易对象的建立对象。如果我上/下多次投票同一笔交易,第七次我投票查询只是坐下来并没有做任何事情。该应用程序不会崩溃,但它也不会保存。如果我进入另一个需要parse.com查询的活动,那么查询也将无效。这是我的投票逻辑(向下投票是相同的)。 假设在onCreate()之前初始化所有使用的变量。 我的查询是否已在某个管道中备份?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        upVoteButton = (Button) findViewById(R.id.deal_up_vote_button);
        upVoteButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                new UpVoteTask().execute();
            }
        });
    }

    // visually changes buttons if they are selected
    private void setButtons(Boolean queryDb) {

        if (queryDb == true) {
            queryParse();
        }

        // if deal found correctly 
        if (deal != null) {
            // if user found correctly
            if (dealVoteUser != null) {
                if (dealVoteUser.get("vote").toString().equals("0")) {
                    upVoteButton.setPressed(false);
                    downVoteButton.setPressed(true);
                } else if (dealVoteUser.get("vote").toString().equals("1")) {
                    upVoteButton.setPressed(true);
                    downVoteButton.setPressed(false);
                } else if (dealVoteUser.get("vote").toString().equals("2")) {
                    upVoteButton.setPressed(false);
                    downVoteButton.setPressed(false);
                }
            }
        }
    }

    // queries parse and populates vars
    private void queryParse(){
        ParseQuery<ParseObject> queryDeal = ParseQuery.getQuery("Deal");
        queryDeal.whereEqualTo("objectId", deal_id);
        try {
            deal = queryDeal.getFirst();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        ParseQuery<ParseObject> queryDealVoteUser = ParseQuery
                .getQuery("deal_vote_users");
        queryDealVoteUser.whereEqualTo("deal", deal).whereEqualTo("user",
                ParseUser.getCurrentUser());
        try {
            dealVoteUser = queryDealVoteUser.getFirst();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    // UpVoteTask AsyncTask
    private class UpVoteTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            if(upVoteProgressDialog != null){
                upVoteProgressDialog.dismiss();
                upVoteProgressDialog = null;
            }
            upVoteProgressDialog = new ProgressDialog(DealsDetailsActivity.this);
            // Set progressdialog message
            upVoteProgressDialog.setMessage("Saving...");
            upVoteProgressDialog.setIndeterminate(false);
            // Show progressdialog
            upVoteProgressDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {
            queryParse();

            // if deal found correctly
            if (deal != null) {
                    // if user has not voted yet
                    if (dealVoteUser == null) {
                        // create new and assign vote to 1
                        dealVoteUser = new ParseObject("deal_vote_users");
                        dealVoteUser.put("deal", deal);
                        dealVoteUser.put("user", ParseUser.getCurrentUser());
                        dealVoteUser.put("vote", 1);
                        up_votes = deal.getInt("up_votes") + 1;
                        down_votes = deal.getInt("down_votes");
                    // if user already down voted
                    } else if (dealVoteUser.get("vote").toString().equals("0")) {
                        // change vote to 1
                        dealVoteUser.put("vote", 1);
                        up_votes = deal.getInt("up_votes") + 1;
                        down_votes = deal.getInt("down_votes") - 1;
                    // if user already up voted 
                    } else if (dealVoteUser.get("vote").toString().equals("1")) {
                        // already voted up, remove vote
                        dealVoteUser.put("vote", 2);
                        up_votes = deal.getInt("up_votes") - 1;
                        down_votes = deal.getInt("down_votes");
                    // if user already voted but cleared vote
                    } else if (dealVoteUser.get("vote").toString().equals("2")) {
                        // change vote to 1
                        dealVoteUser.put("vote", 1);
                        up_votes = deal.getInt("up_votes") + 1;
                        down_votes = deal.getInt("down_votes");
                    }

                    // calculate overall rating percentage
                    if ((up_votes + down_votes) != 0) {
                        rating = (up_votes / (up_votes + down_votes)) * 100;
                    } else if ((up_votes == 0) && (down_votes == 0)) {
                        rating = 0;
                    } else {
                        rating = 50;
                    }

                    deal.put("rating", rating);
                    deal.put("up_votes", up_votes);

                    try {
                        deal.save();
                    } catch (ParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    try {
                        dealVoteUser.save();
                    } catch (ParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } else {
                    // deal not found problem
                }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // visually change buttons without querying db
            setButtons(false);

            //remove progress dialogue
            if(upVoteProgressDialog != null){
                upVoteProgressDialog.dismiss();
                upVoteProgressDialog = null;
            }
        }
    }

2 个答案:

答案 0 :(得分:3)

使用saveInBackground方法 - 它将与save一样,但也会将其保存到应用程序的缓存中,这样在保存数据时就不会得到不同的值,所以它不会对您的申请产生任何明显影响。这是保存或查找的最佳方法(它有一个名为findInBackground的'姐妹'方法)。它就像一个异步任务,不会阻塞你的主线程。

答案 1 :(得分:1)

我将所有解析调用切换到._____ InBackground(),然后将保存逻辑移到onPause()。这样,如果用户决定多次更改投票,我就不会进行多次保存调用。