2015-08-28 1 views
-2

Я разрабатываю приложение для отслеживания транспортных средств и расчета расстояния, пройденного ими. У меня есть устройство, установленное на транспортных средствах, которые отправляют LatLngs на мой мобильный телефон с помощью SMS. В моем приложении хранится SMS-сообщение, содержащее LatLng в SQLiteDatabase. Моя таблица имеет одну широту и долготу в строке. С каждым днем ​​количество строк в моем столе растет. Когда я извлекаю эти данные из таблицы, чтобы нарисовать карту и вычислять расстояние, мое приложение замерзает за одну секунду между каждым попыткой доступа к данным из таблицы. Как сделать это быстрее? Любые предложения, пожалуйста.Выполняет ли выполнение операций с базой данных в MainActivity зависает пользовательский интерфейс?

public void calculateDistance(String date) { 
    googleMap.clear(); 
    double cumulativeDistance = 0; 
    String selectLog1="select rowid _id,* from logTable where date='"+date+"' and deviceNo='"+deviceNo+"'"; 
    Cursor cursor4=db.rawQuery(selectLog1,null); 
    if(cursor4.getCount()>2) { 
     while (cursor4.moveToNext()) { 
      String strLatLng = cursor4.getString(cursor4.getColumnIndex("log")); 
      strDate11=cursor4.getString(cursor4.getColumnIndex("date")); 
      String[] strArray = strLatLng.split(","); 
      latitude2 = Double.parseDouble(strArray[0]); 
      longitude2 = Double.parseDouble(strArray[1]); 
      time11=strArray[2]; 
      coordList1.add(new LatLng(latitude2, longitude2)); 
      timeList.add(strLatLng+","+time11); 
     } 

     BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.ledorange); 
     for (String strData:timeList){ 
      String[] strDatas=strData.split(","); 
      double latData=Double.parseDouble(strDatas[0]); 
      double lngData=Double.parseDouble(strDatas[1]); 
      String timeAt=strDatas[2]; 
      googleMap.addMarker(new MarkerOptions().position(new LatLng(latData,lngData)).title(vehicleName).icon(bitmapDescriptor).snippet("Known @ " + timeAt + "," + strDate11)); 
     } 

     timeList.removeAll(timeList); 

     CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(latitude2, longitude2), 12.5f); 
     googleMap.animateCamera(cameraUpdate); 
     googleMap.addPolyline(new PolylineOptions().addAll(coordList1).width(10).color(getResources().getColor(R.color.myBlue))); 

     DecimalFormat format = null; 
     for (int i = 0; i < (coordList1.size() - 1); i++) { 
      LatLng l1 = coordList1.get(i); 
      double lat1 = l1.latitude; 
      double lng1 = l1.longitude; 
      Location location1 = new Location(""); 
      location1.setLatitude(lat1); 
      location1.setLongitude(lng1); 

      LatLng l2 = coordList1.get(i + 1); 
      double lat2 = l2.latitude; 
      double lng2 = l2.longitude; 
      Location location2 = new Location(""); 
      location2.setLatitude(lat2); 
      location2.setLongitude(lng2); 

      format = new DecimalFormat("#.##"); 
      double distance = location1.distanceTo(location2)/1000; 
      cumulativeDistance = cumulativeDistance + distance; 
     } 
     if (preferences.contains("errorRatio")) { 
      cumulativeDistance =cumulativeDistance + (cumulativeDistance/100) * preferences.getInt("errorRatio", 0); 
     } 
     tvDistance.setText(format.format(cumulativeDistance) + " Km's"); 
     coordList1.removeAll(coordList1); 
    }else { 
     tvDistance.setText("No Data"); 
    } 
} 
+1

'Индексирование' ваш поиск и объединение столбцов - ваш друг. И «AsyncTask». –

ответ

0

Если ваши запросы довольно значительны, это может заморозить вашу основную нить.

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

0

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

private class MyLongTask extends AsyncTask<Void, Void, Void> { 
    protected void doInBackground(Void... params) { 

     // TODO Perform database operations 

     return null; 
    } 

    protected void onPostExecute(Void... params) { 
     // TODO update UI with db results 
    } 
} 

Вы также можете использовать StrictMode для обнаружения сети/IO на главном потоке, и уведомляет вас либо сообщение журнала или исключения.

+0

Могу ли я использовать 'Async Task' в моем потоке пользовательского интерфейса? –

+1

Если вы вызываете .execute(), он будет выполнять основные операции в фоновом потоке, а затем вызывать onPostExecute() в потоке пользовательского интерфейса. – fractalwrench

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