我是Android的初学者。
我的项目中有一个小问题,我想将我的数据保存到解析本地数据,但我不知道该怎么做:
我将BUS_STOP中的数据解析到我的BusStop arraylist。
我在我的应用程序中添加了Parse.enableLocalDatastore(getApplicationContext());
。
这是我的代码下载数据到busstops:
busStops = new ArrayList<>();
try {
ParseQuery<ParseObject> query = new ParseQuery<>("BUS_STOP");
query.orderByAscending("stop_id");
query.setLimit(2000);
listA = query.find();
for (ParseObject mBusStop : listA) {
BusStop newBusStop = new BusStop();
newBusStop.setName((String) mBusStop.get("name"));
newBusStop.setStreet((String) mBusStop.get("street"));
newBusStop.setStyle((String) mBusStop.get("Type"));
newBusStop.setNext_id((int) mBusStop.get("next_id"));
newBusStop.setBus_id((int) mBusStop.get("bus_id"));
newBusStop.setStop_id((int) mBusStop.get("stop_id"));
double x, y;
x = (double) mBusStop.get("coor_x");
y = (double) mBusStop.get("coor_y");
LatLng a = new LatLng(x, y);
newBusStop.setLatLngBus(a);
busStops.add(newBusStop);
}
} catch (com.parse.ParseException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
这是我的班级BusStop
@ParseClassName("BUS_STOP")
public class BusStop extends ParseObject{
String name;
String street;
String style;
LatLng latLngBus;
int bus_id;
int next_id;
int stop_id;
public String getPName(){
return getString("name");
}
public void setPName(String name) {
put("name", name);
}
public String getPStreet(){
return getString("street");
}
public void setPStreet(String street) {
put("street", street);
}
public String getPStyle(){
return getString("Type");
}
public void setPStyle(String type) {
put("Type", type);
}
public double getMCoor_x(){
return getDouble("coor_x");
}
public void setMCoor_x(double coor_x) {
put("coor_x", coor_x);
}
public double getMCoor_y(){
return getDouble("coor_y");
}
public void setMCoor_y(double coor_y) {
put("coor_y", coor_y);
}
public int getMBus_id(){
return getInt("bus_id");
}
public void setMCoor_y(int bus_id) {
put("bus_id", bus_id);
}
public int getMNext_id(){
return getInt("next_id");
}
public void setMNext_id(int next_id) {
put("next_id", next_id);
}
public int getMStop_id(){
return getInt("stop_id");
}
public void setMStop_id(int stop_id) {
put("stop_id", stop_id);
}
public int getStop_id() {
return stop_id;
}
public void setStop_id(int stop_id) {
this.stop_id = stop_id;
}
public int getNext_id() {
return next_id;
}
public void setNext_id(int next_id) {
this.next_id = next_id;
}
public int getBus_id() {
return bus_id;
}
public void setBus_id(int bus_id) {
this.bus_id = bus_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getStyle() {
return style;
}
public void setStyle(String style) {
this.style = style;
}
public LatLng getLatLngBus() {
return latLngBus;
}
public void setLatLngBus(LatLng latLngBus) {
this.latLngBus = latLngBus;
}
}
如果我的方式不好,请告诉我好方法!
答案 0 :(得分:0)
根据我从您的代码和问题中所理解的,当您加载和解析数据时,您将锁定主线程(UI线程)。
主线程负责处理用户输入和所有屏幕绘图。因此,如果一项操作花费的时间过长,您的应用程序将被冻结,直至完成,对于用户来说,您的应用程序似乎已崩溃。
来自Udacity的This video解释得非常好。
您可以在Android here上详细了解Thread
。
this link向您展示如何在后台运行。
编辑:AsyncTask
的示例代码。取自Android dev site。
AsyncTask
允许您在用户界面上执行异步工作。它在工作线程中执行阻塞操作,然后在UI线程上发布结果,而不需要您自己处理线程和/或处理程序。
要使用它,您必须继承AsyncTask
并实现doInBackground()
回调方法,该方法在后台线程池中运行。要更新UI,您应该实现onPostExecute()
,它从doInBackground()
提供结果并在UI线程中运行,因此您可以安全地更新UI。然后,您可以通过从UI线程调用execute()
来运行任务。
例如,您可以通过以下方式使用AsyncTask
实现上一个示例:
public void onClick(View v) {
new DownloadImageTask().execute("http://example.com/image.png");
}
private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
/** The system calls this to perform work in a worker thread and
* delivers it the parameters given to AsyncTask.execute() */
protected Bitmap doInBackground(String... urls) {
return loadImageFromNetwork(urls[0]);
}
/** The system calls this to perform work in the UI thread and delivers
* the result from doInBackground() */
protected void onPostExecute(Bitmap result) {
mImageView.setImageBitmap(result);
}
}
现在UI是安全的,代码更简单,因为它将工作分为应该在工作线程上完成的部分以及应该在UI线程上完成的部分。
您应该阅读AsyncTask
参考资料,以全面了解如何使用此课程,但以下是对其工作原理的快速概述:
doInBackground()
在工作线程上自动执行onPreExecute()
,onPostExecute()
和onProgressUpdate()
都是
在UI线程上调用doInBackground()
返回的值将发送至onPostExecute()
publishProgress()
致电doInBackground()
在UI线程上执行onProgressUpdate()
警告:使用工作线程时可能遇到的另一个问题是由于运行时因活动意外重启 配置更改(例如用户更改屏幕时) orientation),这可能会破坏你的工作线程。看看你怎么样 在其中一次重启期间以及如何正确地执行任务 销毁活动时取消任务,请参阅源代码 对于Shelves示例应用程序。