如何从解析数据库中获取数据并将其用于不同的功能
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 完成后得到通知,那么你可以
像这样实现接口。
我是 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 完成后得到通知,那么你可以 像这样实现接口。