См. Шаг за шагом ниже.
Вы можете использовать следующий оператор, чтобы получить ответ каждого URL.
val arr = arrayOf("https://rafelcf.000webhostapp.com/rafel_cf/1.php",
"https://rafelcf.000webhostapp.com/rafel_cf/2.php")
arr.forEach {
val jsonText = URL(it).readText()
// parse jsonText to objects
println(jsonText)
}
Для анализа jsonтекст, вы можете следовать инструкциям здесь .
Редактировать
Для реализации сетевого подключения в Android,
вам необходимовыполняйте задачу в отдельном потоке, а не в потоке пользовательского интерфейса.
Используя Kotlin anko, вы легко можете добиться этого, используя doAsync
.
Просто оберните код для запуска в doAsync
и оберните полученный код в uiThread
.
doAsync {
val arr = arrayOf(...)
arr.forEach {
...
val result = // parsed result
uiThread {
doSomethingWithResult(result)
}
}
}
Шаг за шагом
Хорошо, я дам вам пошаговые инструкции, так чтоВы можете следовать вместе со своим проектом.
1.Добавьте разрешение на Интернет
Мы будем использовать подключение к Интернету, поэтому мы должны сказать, что нам нужно разрешение на использование Интернета.
- Открыть приложение / манифесты /AndroidManifest.xml .
Добавьте следующий тег в качестве дочернего тега root <manifest>
.
<uses-permission android:name="android.permission.INTERNET"/>
2.Добавить anko
библиотеку
Мы будем использовать библиотеку anko
, чтобы мы могли легко обрабатывать асинхронных задач без шаблонов.
- Открыть Gradle Scripts / build.gradle (Модуль: приложение)
Добавить следующую строку внутри dependencies
.
implementation "org.jetbrains.anko:anko:0.10.8"
- Нажмите Синхронизировать сейчас .
3.doAsync{}
для фоновых задач
Для запроса в фоновом режиме мы используем doAsync
от anko
.
Помещение doAsync
, где вы должны сделать запрос.
В моем случае я отправлю запрос, когда пользователь нажмет кнопку.
btnLoad.setOnClickListener {
doAsync {
}
}
Это приведет к ошибке компиляции.
Чтобы решить эту проблему, просто импорт doAsync
.
4.Проходите по URL и извлекайте ответ
Теперь мы находимся в фоновом режиме, мы можем делать запросы!
Внутри doAsync
, запрашивать и получать ответ.
val arr = arrayOf("https://rafelcf.000webhostapp.com/rafel_cf/1.php",
"https://rafelcf.000webhostapp.com/rafel_cf/2.php")
arr.forEach {
// request and fetch response
val jsonText = URL(it).readText()
}
Теперь у нас есть текст ответа в jsonText
.
5.Разбор ответа
Я просто буду использовать JSONArray
и JSONObject
для разбора jsonText
.
Но вы сами выбираете, какой метод будете использовать.
Вы можете использовать Gson, как вы описали в своем вопросе.
Поскольку теперь мы имеем ответ в array
, мы можем сделать следующее:
// we know that result json is an array
val jsonArray = JSONArray(jsonText)
for(i in 0 until jsonArray.length()) {
// get each elements
val jsonObject = jsonArray[i] as JSONObject
// get data of each elements
val idLocal = jsonObject.getString("idLocal")
val idClubLocal = jsonObject.getString("idClubLocal")
val nomLocal = jsonObject.getString("nomLocal")
}
6.Сделайте что-нибудь с проанализированными результатами
Теперь, когда мы проанализировали данные, осталось только что-то с ними сделать.
Я просто записываю данные в logcat.
Я определил log()
, чтобы упростить коды регистрации.
fun log(message: String) = Log.d("MainActivity", message)
Теперь я зарегистрировал полученные данные.
log("[item $i]")
log("idLocal: $idLocal")
log("idClubLocal: $idClubLocal")
log("nomLocal: $nomLocal")
С этого момента, когда вы запускаете этот код, выВы сможете увидеть результат, подобный этому, в logcat.
MainActivity: [item 0]
MainActivity: idLocal: 0201010551
MainActivity: idClubLocal: 0201010
MainActivity: nomLocal: AAAAA
MainActivity: [item 1]
MainActivity: idLocal: 0201045201
MainActivity: idClubLocal: 0201045
MainActivity: nomLocal: BBBBB
MainActivity: [item 0]
MainActivity: idLocal: 0201010551
MainActivity: idClubLocal: 0201010
MainActivity: nomLocal: CCCCC
MainActivity: [item 1]
MainActivity: idLocal: 0201045201
MainActivity: idClubLocal: 0201045
MainActivity: nomLocal: DDDDD
Как видите, это данные, которые предоставляют ваши URL.
7.Пусть что-то запускается в uiThread
Обратите внимание, что весь наш код выполняется в асинхронном режиме.
Иногда нам нужно что-то сделать с результатом в потоке пользовательского интерфейса ,например,
- Обновление
TextView
как запрос - Добавление нового элемента в
RecyclerView
Сейчас я буду придерживаться данных регистрации вместообновление пользовательского интерфейса.
Чтобы запустить код в потоке пользовательского интерфейса, просто оберните код с помощью предложения uiThread
.
Возможно, вам также придется импортировать uiThread
.
uiThread {
log("[item $i]")
log("idLocal: $idLocal")
log("idClubLocal: $idClubLocal")
log("nomLocal: $nomLocal")
}
Код работает точно так же, за исключением того, что регистрация теперь работает в потоке пользовательского интерфейса.
ПОЛНЫЙ КОД
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnLoad.setOnClickListener {
doAsync {
val arr = arrayOf("https://rafelcf.000webhostapp.com/rafel_cf/1.php",
"https://rafelcf.000webhostapp.com/rafel_cf/2.php")
arr.forEach {
val jsonText = URL(it).readText()
// we know that result json is an array
val jsonArray = JSONArray(jsonText)
for(i in 0 until jsonArray.length()) {
// get each elements
val jsonObject = jsonArray[i] as JSONObject
// get data of each elements
val idLocal = jsonObject.getString("idLocal")
val idClubLocal = jsonObject.getString("idClubLocal")
val nomLocal = jsonObject.getString("nomLocal")
uiThread {
log("[item $i]")
log("idLocal: $idLocal")
log("idClubLocal: $idClubLocal")
log("nomLocal: $nomLocal")
}
}
}
}
}
}
fun log(message: String) = Log.d("MainActivity", message)
}