Я пытаюсь создать приложение, используя API OpenWeatherMap.Проблема, с которой я сталкиваюсь, связана с функцией поиска.Я хочу реализовать AutoCompleteTextView
, но здесь я сталкиваюсь со следующими проблемами:
Мне нужно скачать массив JSON, содержащий все города.Файл, содержащий все это, составляет 4 Мб, но он упакован в архив gzip.Я могу распаковать его и скачать с кодом, указанным ниже.После распаковки выходной файл имеет размер 28 МБ.
val listUrl =
URL("http://bulk.openweathermap.org/sample/city.list.json.gz")
try {
//try to get connection with given url
val connection: HttpURLConnection =
listUrl.openConnection() as HttpURLConnection
connection.connect()
if (connection.responseCode == 200){
//if connection was succesful
//take data from the URL, ungzip and save in app
//directory as "citylist.json"
var stream = connection.inputStream
stream = GZIPInputStream(stream)
val inputSource = InputSource(stream)
val input = BufferedInputStream(inputSource.byteStream)
val output = FileOutputStream(context.filesDir.toString() + "/citylist.json") as OutputStream
val buffer = ByteArray(connection.contentLength)
var count = 0
var total = 0
while ({count = input.read(buffer); count}() != -1) {
total += count
output.write(buffer, 0, count)
}
output.flush()
output.close()
input.close()
}
} catch (e: FileNotFoundException){
Log.e("Not found", e.toString())
} catch (e: IOException){
Log.e("404", e.toString())
} catch (e: BufferOverflowException){
Log.e("Buffer", e.toString())
}
Тем не менее, при каждом запуске приложения приложение должно было бы перебирать каждую строку кода, чтобычитать из массива JSON, создать Array of Strings и установить для него значение ArrayAdapter, для которого будет установлено значение AutoCompleteTextView
.Это большая работа, поэтому я могу волноваться, что приложение будет иметь низкую производительность или будет потреблять много батареи.
- Второй вариант, который я могу сделать, это непосредственно поместить файл в папку Assets.Позже я должен все еще делать вещи, описанные выше.Я думаю, что все еще не имеет смысла, потому что пользователь должен был бы загрузить приложение с размером больше на 28 МБ из магазина.
- Третий вариант, лучший, но я не знаю, как это реализовать.Я гуглил за это, но я не смог найти ничего не осуждаемого.Используйте внешнюю поисковую систему, например, на сайте OpenWeatherMap: https://openweathermap.org/find.Это может дать пользователю прогнозы, но после выбора пользователя приложению города должен быть присвоен идентификатор города (не имя, не широта и долгота, а идентификатор, чтобы избежать несовпадений).
Может кто-нибудь подсказать мне какую-либо идеюкак достичь своей цели?Предполагая, работал ли я над каким-либо другим онлайн-приложением, где находится поисковая система, реализация выглядит так же, как в этом примере?