我有一个要解析的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)
}
答案 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。
添加以下标记作为根<manifest>
标记的子标记。
<uses-permission android:name="android.permission.INTERNET"/>
2。添加anko
库
我们将使用anko
库,以便我们无需模板即可轻松处理异步任务。
在dependencies
内添加以下行。
implementation "org.jetbrains.anko:anko:0.10.8"
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。解析响应
我将只使用jsonText
和JSONArray
来解析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
}
}
}
}
}
}