#kotlin #retrofit2
#kotlin #retrofit2
Вопрос:
Данные сервера Json отображаются в Android с использованием retrofit2 и rxjava2, когда параметр передается в inteface, а затем выдает ошибку.
class Sales : AppCompatActivity() {
internal lateinit var api : APIInterface
private var compositeDisposable : CompositeDisposable? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_sales)
compositeDisposable = CompositeDisposable()
fetchYearData()
}
private fun fetchYearData(){
val retrofit = APIClient.apIClient
if (retrofit != null) {
api = retrofit.create(APIInterface::class.java)
}
compositeDisposable!!.add(api.getSalesGSTData(1,1,"04/01/2018","31/03/2019")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe( { displaySalesGSTData(it.salesGST) },
{
Toast.makeText(this,it.message,Toast.LENGTH_LONG).show()
}))
}
Класс модели SalesGSTList JSONObject после его успеха и после JSONArray и JSONObject .
SalesGSTList.kt
class SalesGSTList {
val success : String = ""
lateinit var salesGST : ArrayList<SalesGST>
}
SalesGST.kt
class SalesGST {
var FYearID : Int = 0
var Cmp_Name : String? = ""
var GSTIN : String? = ""
}
Интерфейс
@GET("SalesGST.php")
fun getSalesGSTData(@Query("cid") cid : Int,@Query("fid") fid : Int,@Query("fd") fd : String,@Query("td") td : String) : Observable<SalesGSTList>
Ответ №1:
Просто удалите lateinit
из строки lateinit var salesGST : ArrayList<SalesGST>
SalesGSTList
.
class SalesGSTList {
val success : String = ""
var salesGST : ArrayList<SalesGST>? = null
// you can also use
// var salesGST : ArrayList<SalesGST> = ArrayList()
}
для получения дополнительной информации посетите kotlin-when-to-use-lazy-или-lateinit
Комментарии:
1. потому
salesGST
что равно null, если переменной не присвоено значение. ВО- ПЕРВЫХ , Kotlin дает вам возможность работать безопасно и избегать исключения NullPointerException. ВО- вторых , вы также можете обернуть код, в котором вы попадаетеsalesGST
в условие not null, напримерif(salesGST !=null){}
. В- ТРЕТЬИХ , вы можете использоватьvar salesGST : ArrayList<SalesGST> = ArrayList()
вместоvar salesGST : ArrayList<SalesGST>? = null
.2. но я создал другой класс модели, объявив Arraylist : lateinit var year : ArrayList<Год> . его данные успешно получены.
3. всякий раз, когда вы используете
lateinit
свойство, вы должны присвоить значение переменной, иначе она выдаст ошибкуkotlin.UninitializedPropertyAccessException: lateinit property has not been initialized
. ПОЭТОМУ лучшим вариантом является использованиеvar salesGST : ArrayList<SalesGST> = ArrayList()
, которое возвращает пустой список массивов и никогда не выдает никаких ошибок.4. var salesGST : ArrayList<SalesGST> = ArrayList() дает нулевой список массивов