2015-10-05 4 views
1

Я новичок в Android. У меня есть небольшая проблема в моем проекте, я хочу сохранить свои данные в синтаксическом анализе для локальных данных, но я не знаю, как это сделать: Я загрузил данные из BUS_STOP в синтаксическом анализаторе для моего ассенизатора BusStop. Я добавил 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(); 
    } 

и это мой класс Автобусная остановка

@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

Ждать, работает ваш код или нет? – Mauker

+0

да, он работает, но загружает только данные онлайн ... когда я открываю задержку приложения 2s для данных загрузки –

+0

Вам придется загружать эти данные в фоновый поток, используя 'Сервис',' AsyncTask', рабочий 'Thread' или что-то типа того. – Mauker

ответ

0

Из того, что я понял из вашего кода и вопроса, вы блокируете свой основной поток (поток пользовательского интерфейса) при загрузке и анализе своих данных.

Главный поток отвечает за ввод пользователя и весь рисунок экрана. Поэтому, если одна операция занимает слишком много времени, ваше приложение будет заморожено до тех пор, пока оно не закончится, и для пользователя это будет похоже на то, что ваше приложение разбилось.

This video от Udacity объясняет это очень хорошо.

enter image description here

Вы можете прочитать больше о Thread на Android here.

И this link показывает вам, как управлять вещами на заднем плане.


EDIT: Пример кода для AsyncTask. Взято с Android dev site.

AsyncTask позволяет выполнять асинхронную работу с вашим пользовательским интерфейсом. Он выполняет операции блокировки в рабочем потоке, а затем публикует результаты в потоке пользовательского интерфейса, не требуя, чтобы вы сами обрабатывали потоки и/или обработчики.

Чтобы использовать его, вы должны подкласса AsyncTask и реализовать метод обратного вызова doInBackground(), который работает в пуле фоновых потоков. Чтобы обновить свой пользовательский интерфейс, вы должны реализовать onPostExecute(), который доставляет результат от doInBackground() и запускается в потоке пользовательского интерфейса, поэтому вы можете безопасно обновлять свой интерфейс. Затем вы можете запустить задачу, вызвав 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); 
    } 
} 

Теперь интерфейс является безопасным и код является более простым, потому что она отделяет работу в той части, которая должна быть сделана на рабочий поток и часть, которая должна выполняться в потоке пользовательского интерфейса.

Вы должны прочитать AsyncTask ссылки для полного понимания того, как использовать этот класс, но вот краткий обзор того, как это работает:

  • Вы можете указать тип параметров, значение прогресса и конечное значение задачи, используя родовые
  • метод doInBackground() автоматически выполняет на рабочий поток
  • onPreExecute(), onPostExecute() и onProgressUpdate() все вызывается в потоке пользовательского интерфейса
  • Значение, возвращаемое doInBackground() отправляется onPostExecute()
  • Вы можете позвонить publishProgress() в любое время в doInBackground() для выполнить onProgressUpdate() в потоке пользовательского интерфейса
  • Вы можете отменить задание в любое время, из любого потока

Внимание: Еще одна проблема, которая может возникнуть при использовании рабочего потока неожиданно перезагружается в вашей деятельности в связи с runtim e изменение конфигурации (например, когда пользователь меняет экран ), что может привести к уничтожению рабочего потока. Чтобы увидеть, как вы можете сохранить свою задачу во время одной из этих перезапуска и как правильно отменить задачу при уничтожении действия, см. Исходный код для примера приложения для полки.

Смежные вопросы