Некоторые URL для парсера - PullRequest
0 голосов
/ 27 января 2019

У меня есть массив URL, который я хочу проанализировать, как мне его получить?То, что я хочу, это чтобы увидеть все URL-адреса в одном и том же RecyclerView.

doAsync {
            val array = arrayOf("https://rafelcf.000webhostapp.com/rafel_cf/1.php",
                    "https://rafelcf.000webhostapp.com/rafel_cf/2.php")

            array.forEach 

val url = (это)

            val stringRequest = StringRequest(Request.Method.GET, url, Response.Listener { response ->
                val builder = GsonBuilder()
                val mGson = builder.create()

                uiThread {

                    val items: List<ModelJor>

items = (Arrays.asList (* mGson.fromJson (ответ, Array :: class.java)))

                    val filtro = items.filter { it.estadoPartido == "Pendiente" && it.fecha != "" }

                    recyclerView!!.layoutManager = GridLayoutManager(activity!!, 1)

                    val adapter = AdapNJ(activity!!, filtro)
                    recyclerView!!.adapter = adapter

                    adapter.notifyDataSetChanged();
                }

            }, Response.ErrorListener { error -> Log.d(TAG, "Error " + error.message) })
            queue.add(stringRequest)
        }

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Решение:

fun getPendientes() {

        doAsync {

            for(num in 1..30) {

                val arr = arrayOf(
                        "http://www.url$num")

                arr.forEach {

                    val jsonText = URL(it).readText()

                    val jsonArray = JSONArray(jsonText)
                    for (i in 0 until jsonArray.length()) {

                        val pendientes = jsonArray.optJSONObject(i)

                        val nomLocal = pendientes.getString("nomLocal")
                        val resulLocal = pendientes.getString("resulLocal")
                        val escudoLocal = pendientes.getString("escudoLocal")
                        val nomVisitante = pendientes.getString("nomVisitante")
                        val resulVisitante = pendientes.getString("resulVisitante")
                        val escudoVisitante = pendientes.getString("escudoVisitante")
                        val fecha = pendientes.getString("fecha")
                        val hora = pendientes.getString("hora")
                        val estadoPartido = pendientes.getString("estadoPartido")
                        val abreviaturaEstado = pendientes.getString("abreviaturaEstado")

                        modelPendientes.add(ModelPendientes(nomLocal, resulLocal, escudoLocal,
                                nomVisitante, resulVisitante, escudoVisitante, fecha, hora, estadoPartido,abreviaturaEstado))

                        val filtro = modelPendientes
                                .filter {it ->
                                        it.abreviaturaEstado == "P" ||
                                        it.abreviaturaEstado == "A" ||
                                        it.abreviaturaEstado == "S" &&
                                        it.fecha != ""
                                }

                        uiThread {
                            /*val filtro = modelPendientes.filter { it.abreviaturaEstado == "A" ||
                                    it.abreviaturaEstado == "S" || it.abreviaturaEstado == "P" && it.fecha != ""*/
                            //}
                            recyclerView!!.layoutManager = GridLayoutManager(activity!!, 1)
                            adapter = PendientesAdapter(filtro, activity!!)
                            recyclerView!!.adapter = adapter
                        }
                    }
                }
            }
        }
    }
0 голосов
/ 28 января 2019

См. Шаг за шагом ниже.


Вы можете использовать следующий оператор, чтобы получить ответ каждого 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.Добавьте разрешение на Интернет

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

  1. Открыть приложение / манифесты /AndroidManifest.xml .
  2. Добавьте следующий тег в качестве дочернего тега root <manifest>.

    <uses-permission android:name="android.permission.INTERNET"/>

2.Добавить anko библиотеку

Мы будем использовать библиотеку anko, чтобы мы могли легко обрабатывать асинхронных задач без шаблонов.

  1. Открыть Gradle Scripts / build.gradle (Модуль: приложение)
  2. Добавить следующую строку внутри dependencies.

    implementation "org.jetbrains.anko:anko:0.10.8"

  3. Нажмите Синхронизировать сейчас .

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...