如何从解析数据库中获取数据并将其用于不同的功能

how to fetch data from parse database and use it in different function

我是 android 工作室的新手,正处于学习阶段。 我能够获取当前用户位置并将其存储在 Parse 服务器中。现在,我还在 class "Hospitals" 中的 Parse 数据库中存储了一些超市的地理位置。现在我正在尝试检索特定医院的地理位置,并尝试比较当前用户与医院之间的距离。

当我尝试从 Parse 数据库中获取值时,它是在后台计算的,因此我无法在不同的函数中使用它来获取距离差异,因为 return 值将为空。

使用以下代码:

 class RemoteDataTask extends AsyncTask<Void, Void, Void> {

   ProgressDialog mProgressDialog;

     private Context context;

List<ParseUser> object = new ArrayList<>();
final ParseGeoPoint[] parlourUser = new ParseGeoPoint[1];

RemoteDataTask(Context context) {
    Log.i("info", "Enetred RemoteDataTask");
    this.context = context;
}      

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

    Log.i("info", "Entered doInbackground");

    ParseQuery<ParseUser> query = ParseUser.getQuery();

    try{

        Log.i("info", "value is " + query.get("aifg14PNKz"));


        object.set(1, query.get("aifg14PNKz"));

        Log.i("info", "Object value" + object.get(1));

        parlourUser[0] = object.get(0).getParseGeoPoint("Location");
        Log.i("info", "Location of parlour user " + parlourUser[0]);


    } catch (ParseException e) {
        e.printStackTrace();
    }

}

首先,创建依赖于后台线程的函数是非常错误的做法。

query.getInBackground

它将在后台线程上工作,

后台查询完成后,此回调方法与UI线程通信

new GetCallback<ParseObject>() {
            @Override
            public void done(ParseObject object, ParseException e) {
}

如果query.getInBackground需要一些时间,您的功能将无法运行。

两步解决你的问题

1) 您可以在 AsyncTask 中调用它并在后台处理查询

 // RemoteDataTask AsyncTask
    ProgressDialog mProgressDialog;

    private class RemoteDataTask extends AsyncTask<Void, Void, Void> {

        private  Context context;
        List<ParseObject> object;
        final ParseGeoPoint[] hospitalUser = new ParseGeoPoint[1];

        RemoteDataTask(Context context) {
            this.context = context;
        }



        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // Create a progressdialog
            mProgressDialog = new ProgressDialog(context);
            // Set progressdialog title
            mProgressDialog.setTitle("Title...");
            // Set progressdialog message
            mProgressDialog.setMessage("Loading...");
            mProgressDialog.setIndeterminate(false);
            // Show progressdialog
            mProgressDialog.show();
        }

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


            // Create the array
            try {

                ParseQuery<ParseObject> query = ParseQuery.getQuery("Lakme");
                object = query.find();

                if (ob != null) {
                    hospitalUser[0] = object.getParseGeoPoint("Location");

                    //calculate distance
                }


            } catch (ParseException e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            // Close the progressdialog
            mProgressDialog.dismiss();
           // You can use "hospitalUser" Object here.

        }
    }

从你调用这个方法的地方调用它

new RemoteDataTask(YourActivity.this).execute();

2) 查询得到结果后计算距离

  • 如果不涉及UI线程那么可以在 "doInBackground" 或
  • 如果它确实涉及 UI 线程,您应该在 "onPostExecute" 或
  • 中使用它
  • 如果你想在 AsyncTask 完成后得到通知,那么你可以 像这样实现接口。