Android:从Parse.com下载大量数据

时间:2014-07-17 05:27:48

标签: android database download parse-platform progressdialog

我正在从Parse.com下载数据(String中的一些长消息)。

虽然代码以前在数据量较小时工作,但现在当数据库变大时,对于较弱的设备,下载过程将失败。代码如下:

代码:

// RemoteDataTask AsyncTask
    private class DownloadRemoteDataTask_message extends AsyncTask<Void, Void, Void> 
    {
        @Override
        protected void onPreExecute() 
        {
            super.onPreExecute();            
            mProgressDialog = new ProgressDialog(CopyOfFirst2.this);    
            mProgressDialog.setTitle("Please wait!");                                 
            mProgressDialog.setMessage("Updating database...");                 
            mProgressDialog.setIndeterminate(false);      
            mProgressDialog.setCancelable(false);
            mProgressDialog.show(); 
        }

        @Override
        protected Void doInBackground(Void... params) 
        {            
            ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("MessagesDB");
            query.whereEqualTo("status", "accepted");
            query.setLimit((total_message_be_dl+1));
            query.orderByDescending("qref_message");

            try 
            {
                ob_message = query.find();
            } 
            catch (ParseException e) 
            {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) 
        {           
            for (ParseObject parse_table : ob_message)
            {
                String t_objectID = parse_table.getObjectId();
                String t_status = (String) parse_table.get("status");
                String t_user = (String) parse_table.get("username");
                String t_source = (String) parse_table.get("source");
                String t_title= (String) parse_table.get("title");
                int t_qref_canton = (Integer) parse_table.get("qref_canton");
                String t_canton = (String) parse_table.get("canton");
                int t_qref_message = (Integer) parse_table.get("qref_message");
                String t_message = (String) parse_table.get("message");

                String St_qref_canton = String.valueOf(t_qref_canton);
                String St_qref_message = "C"+String.valueOf(t_qref_message);

                String conso =
                          t_objectID        + "----\n"              //0        
                        + t_status          + "----\n"              //1 
                        + t_user            + "----\n"              //2
                        + t_source          + "----\n"              //3
                        + t_title           + "----\n"              //4
                        + t_qref_canton     + "----\n"              //5
                        + t_canton          + "----\n"              //6
                        + t_qref_message    + "----\n"              //7
                        + t_message         + "----\n"              //8
                        ;           

                SharedPreferences.Editor e = settings.edit();
                e.putString(St_qref_message,conso);
                e.commit();
            }             
            mProgressDialog.dismiss();
            custom_dialog(total_message_be_dl);
        }
    }   

问题:

ProgressDialog停止运行(在进程结束之前?),它会为更强大和更弱的设备冻结一段时间。

但是对于更强大的设备,大约7到8秒,custom_dialog弹出一条成功的消息,计算下载的总消息。

但是对于较弱的设备,它之后就会变黑。

到目前为止的消息量约为600条消息(包含中英文字符),相信每天会有+ 10条消息。

由于参考唯一密钥(qref xxx)的简单性,下载的数据将仅存储为SharedPrefrenece而不是本地数据库,

如何改进上述代码?或者如何才能使progressDialog在所有工作完成之前不会过快消失?

谢谢!

1 个答案:

答案 0 :(得分:0)

SharedPreferences.Editor编辑器;方法 commit()是一项昂贵的操作

这个电话肯定应该最小化。您可以在活动的onPause()内调用一次,以确保所有操作都得到更新。

了解更多详情: http://typorrhea.wordpress.com/2010/10/31/android-sharedpreferences-edit-commit-is-expensive/