#android #kotlin #retrofit
#Android #kotlin #обновление
Вопрос:
во-первых, извините за плохой английский, я пытаюсь создать приложение с использованием гистограммы, мне нужно получить данные для bar из Api, поэтому я использую retrofit для вызова данных и помещаю данные в панель, но я застрял там, где при вызове данные равны нулю, но если я откроювеб-интерфейс api, который он показывал в моем браузере
это мой ApiService.kt
import com.abisayuti.coalyardstock.service.IssueRecieve.ResponseIssue
import retrofit2.Call
import retrofit2.http.GET
interface ApiService {
@GET("2019/coal/index.php/api/monitoring/shipping/")
fun fetchAllShipping(): Call<List<ResponseCS1k>>
@GET("2019/coal/index.php/api/monitoring/issue_stock?unit=u12")
fun fetchAllCoal(): Call<ResponseIssue>
}
это мой ResponseIssue.kt
package com.abisayuti.coalyardstock.service.IssueRecieve
import com.google.gson.annotations.SerializedName
data class ResponseIssue(
@field:SerializedName("name_coal")
val nameCoal: String? = null,
@field:SerializedName("qty_stock")
val qtyStock: String? = null,
@field:SerializedName("name_vendor")
val nameVendor: String? = null,
@field:SerializedName("timestamp")
val timestamp: String? = null
)
и это setDataBar() в моем IRFragmentUnit_1K.kt
internal fun setDataBar() {
val httpClient = OkHttpClient.Builder()
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
httpClient.interceptors().add(interceptor)
val gson = GsonBuilder()
.setLenient()
.create()
val retrofit = Retrofit.Builder()
.baseUrl(baseurl)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
val service = retrofit.create(ApiService::class.java)
val call = service.fetchAllCoal()
call.enqueue(object : Callback<ResponseIssue> {
override fun onFailure(call: Call<ResponseIssue>, t: Throwable) {
Log.d("onFailure", "onFailure ${t.message}")
}
override fun onResponse(call: Call<ResponseIssue>, response: Response<ResponseIssue>) {
val respon = response.body()!!
val y = respon.qtyStock.toString()
val name = respon.nameVendor.toString()
Log.d("OnResponse", "ada ${name}")
Log.d("onResponse", "ada ${y}")
val bargroup = ArrayList<BarEntry>()
val bargroup2 = ArrayList<BarEntry>()
val bargroup3 = ArrayList<BarEntry>()
val bargroup4 = ArrayList<BarEntry>()
val bargroup5 = ArrayList<BarEntry>()
val bargroup6 = ArrayList<BarEntry>()
val bargroup7 = ArrayList<BarEntry>()
bargroup.add(BarEntry(0f, 0f, name))
bargroup2.add(BarEntry(1f, 0f, name))
bargroup3.add(BarEntry(2f, 0f, name))
bargroup4.add(BarEntry(3f, 0f, name))
bargroup5.add(BarEntry(4f, 0f, name))
bargroup6.add(BarEntry(5f, 0f, name))
bargroup7.add(BarEntry(6f, 0f, name))
// creating dataset for Bar Group
val barDataSet = BarDataSet(bargroup, name)
val barDataSet2 = BarDataSet(bargroup2, name)
val barDataSet3 = BarDataSet(bargroup3, name)
val barDataSet4 = BarDataSet(bargroup4, name)
val barDataSet5 = BarDataSet(bargroup5, name)
val barDataSet6 = BarDataSet(bargroup6, name)
val barDataSet7 = BarDataSet(bargroup7, name)
val data =
BarData(barDataSet, barDataSet2, barDataSet3, barDataSet4, barDataSet5, barDataSet6, barDataSet7)
val textSize = "10"
bar_chart_unit3.data = data
bar_chart_unit3.xAxis.position = XAxis.XAxisPosition.BOTTOM
bar_chart_unit3.xAxis.labelCount = 11
bar_chart_unit3.xAxis.enableGridDashedLine(5f, 5f, 0f)
bar_chart_unit3.axisRight.enableGridDashedLine(5f, 5f, 0f)
bar_chart_unit3.axisLeft.enableGridDashedLine(5f, 5f, 0f)
bar_chart_unit3.description.isEnabled = false
bar_chart_unit3.animateY(1000)
bar_chart_unit3.legend.isEnabled = true
bar_chart_unit3.legend.textSize = textSize.toFloat()
bar_chart_unit3.setPinchZoom(true)
bar_chart_unit3.data.setDrawValues(false)
}
})
в Logcat отображается это
D/OnResponse: ada null
D/onResponse: ada null
это мой ответ json
[
{
qty_stock: "500",
name_vendor: "BUKIT ASAM",
name_coal: "COAL YARD I",
timestamp: "2019-03-01",
},
{
qty_stock: "150",
name_vendor: "BUKIT ASAM",
name_coal: "COAL YARD I",
timestamp: "2019-03-02",
},
{
qty_stock: "20",
name_vendor: "JORONG",
name_coal: "COAL YARD I",
timestamp: "2019-03-01",
},
{
qty_stock: "400",
name_vendor: "SSP",
name_coal: "COAL YARD IV",
timestamp: "2019-03-01",
},
]
Комментарии:
1. опубликуйте свой json respose
2. @Naveen хорошо, я опубликовал это
3. Ваш ответ — это массив, а не объект. Измените свой
Call<ResponseIssue>
наCall<List<ResponseIssue>>
и измените также свою модифицированную реализацию.4. @Naveen как я это изменяю
override fun onResponse(call: Call<List<ResponseIssue>>, response: Response<List<ResponseIssue>>) { val respon = response.body()!! val y = respon.qtyStock.toString()
, потому что qtyStock не может быть вызван после того, как я изменил его на<List<RespnseIssue>>
5. Вы получаете список ответов, это означает, что вы либо выбираете определенный (первый?), Либо перебираете их с
for
помощью цикла.
Ответ №1:
Ваш ответ — это массив, а не объект.
Измените свой интерфейс, как показано ниже
@GET("2019/coal/index.php/api/monitoring/issue_stock?unit=u12")
fun fetchAllCoal(): Call<List<ResponseIssue>>
}
Затем в вашем onResponse
получите вашу переменную, как показано ниже.
val respon = response.body()!!
val y = respon[0].qtyStock.toString(),
val name = respon[0].nameVendor.toString()
Или используйте цикл for для перебора всех значений из arraylist.
Комментарии:
1. пожалуйста, помогите (снова) я получил это в logcat
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
, я уверен, что это не из вашего ответа2. Вы изменили свою модификацию при ответе с помощью List<ResponseIssue>?
3. эта ошибка указывает на то, что вы анализируете объект, а не массив.
4. Не только в onResponse. Также измените на
call.enqueue(object : Callback<List<ResponseIssue>>
с полной новой реализацией. Не повторяйте существующий обратный вызов.
Ответ №2:
internal fun setDataBar() {
val httpClient = OkHttpClient.Builder()
val interceptor = HttpLoggingInterceptor()
interceptor.level = HttpLoggingInterceptor.Level.BODY
httpClient.interceptors().add(interceptor)
val gson = GsonBuilder()
.setLenient()
.create()
val retrofit = Retrofit.Builder()
.baseUrl(baseurl)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
val service = retrofit.create(ApiService::class.java)
val call = service.fetchAllCoal()
call.enqueue(object : Callback<List<ResponseIssue>> {
override fun onFailure(call: Call<List<ResponseIssue>>, t: Throwable) {
Log.d("Response", "${t.message}")
}
override fun onResponse(call: Call<List<ResponseIssue>>, response: Response<List<ResponseIssue>>) {
val respon = response.body()!!
val y = respon[0].qtyStock!!.toFloat()
val name = respon[0].nameVendor.toString()
Log.d("Response", "Name ${name}")
Log.d("Response", "Y ${y}")
}
}) }