解析器的一些URL

时间:2019-01-27 10:45:20

标签: parsing kotlin

我有一个要解析的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 =(it)

            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(response,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 :(得分:1)

请参见下面的分步进行


您可以使用以下语句获取每个网址的响应。

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文本,您可以按照说明here进行操作。

修改

要在android中实现网络连接,

您需要在单独的线程中而不是在UI线程中完成任务。

使用Kotlin anko,您可以使用doAsync轻松实现这一目标。

只需包装要在doAsync子句中运行的代码

并将结果代码包装在uiThread子句中。

doAsync {
    val arr = arrayOf(...)
    arr.forEach {
        ...

        val result = // parsed result
        uiThread {
            doSomethingWithResult(result)
        }
    }
}

一步一步

好的,我将逐步为您提供指导,以便您可以继续进行项目。

1。添加互联网权限

我们将使用Internet连接,所以我们必须告知我们需要许可才能使用Internet。

  1. 打开 app / manifests / AndroidManifest.xml
  2. 添加以下标记作为根<manifest>标记的子标记。

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

2。添加anko

我们将使用anko库,以便我们无需模板即可轻松处理异步任务

  1. 打开 Gradle脚本/build.gradle(模块:应用)
  2. dependencies内添加以下行。

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

  3. 点击立即同步

3。 doAsync{}用于后台任务

要在后台请求,我们使用doAsync的{​​{1}}。

anko子句放在您必须进行请求的位置。

就我而言,当用户单击按钮时,我将发送请求。

doAsync

这将导致编译错误。

要解决此问题,只需导入 btnLoad.setOnClickListener { doAsync { } }

4。遍历网址并获取响应

现在我们处于后台,我们可以发出请求!

doAsync内,请求并获取响应。

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() } 中有回复文本。

5。解析响应

我将只使用jsonTextJSONArray来解析JSONObject

但是您可以选择使用哪种方法。

您可以按照问题中的描述使用Gson。

由于我们现在的响应位于jsonText中,因此我们可以执行以下操作:

array

6。对解析结果进行处理

现在我们已经解析了数据,剩下的就是要做一些处理。

我将简单地将数据记录到logcat中。

我定义了// 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") } 来简化日志代码。

log()

现在,我记录了我获取的数据。

fun log(message: String) = Log.d("MainActivity", message)

从这一点来看,当您运行此代码时,您将能够在logcat中看到类似的结果。

log("[item $i]")
log("idLocal: $idLocal")
log("idClubLocal: $idClubLocal")
log("nomLocal: $nomLocal")

如您所见,这些是您的网址提供的数据。

7。让某些东西在uiThread中运行

请注意,我们所有的代码均以异步方式运行。

有时候,我们需要对 ui线程中的结果进行处理,例如

  • 根据请求更新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
  • 将新项目添加到TextView

现在,我将继续记录数据而不是更新uis。

要在ui线程中运行代码,只需使用RecyclerView子句包装代码即可。

您可能还需要导入uiThread

uiThread

除了日志记录现在可以在ui线程中工作之外,代码的工作原理完全相同。

完整代码

uiThread {
    log("[item $i]")
    log("idLocal: $idLocal")
    log("idClubLocal: $idClubLocal")
    log("nomLocal: $nomLocal")
}

答案 1 :(得分:0)

解决方案:

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
                        }
                    }
                }
            }
        }
    }