我真的很困惑,需要您的帮助!这只是我的第二个应用程序,也是我第一次使用REST API。我只是想显示一些用户信息,例如名称和个人资料图片。当我在主Activity中使用代码时,它工作得很好,但是一旦我为其使用其他类,API调用就会失败,并且代码非常相似,因此我一无所知。由于Twitter在他们自己的教程中使用Retrofit,因此我也正在使用它。
我的类扩展了TwitterApiClient,该文件还包括自定义服务的接口:
import android.util.Log
import com.twitter.sdk.android.core.*
import com.twitter.sdk.android.core.models.User
import retrofit2.Call
import retrofit2.http.GET
import retrofit2.http.Query
class MyTwitterApiClient(session: TwitterSession) : TwitterApiClient(session) {
fun getCustomService() : GetUsersShowAPICustomService {
return getService(GetUsersShowAPICustomService::class.java)
}
}
interface GetUsersShowAPICustomService {
@GET("/1.1/users/show.json")
fun show(@Query("user_id") userId: Long) : Call<User>
}
MainActivity中的“我的方法”如下所示:
private fun loadTwitterAPI(userID: Long) {
MyTwitterApiClient(session).getCustomService().show(userID).enqueue(object : Callback<User>() {
override fun success(result: Result<User>?) {
text.text = (
"Name: "+result!!.data.name
+"\nLocation: "+result!!.data.location
+"\nFriends: "+result!!.data.friendsCount
)
Picasso.with(baseContext).load(result!!.data.profileImageUrl).resize(250, 250).into(imageView)
}
override fun failure(exception: TwitterException?) {
}
})
}
这工作得很好,但是我不想在自己的主要活动中调用它,我在类中创建了一个伴侣对象,扩展了TwitterApi,应该简单地使用TwitterSession作为参数来调用它,并且它应该返回一个对象包含所有重要数据的User类。
MyTwitterApiClient类中的配套对象看起来像这样:
companion object {
fun start(session: TwitterSession): User {
val userID = session.userId
var data: User? = null
MyTwitterApiClient(session).getCustomService().show(userID).enqueue(object : Callback<User>() {
override fun success(result: Result<User>?) {
data = result!!.data
}
override fun failure(exception: TwitterException?) {
throw exception!!
}
})
return data!!
}
}
MainActivity中的新方法如下:
private fun loadTwitterAPI(userID: Long) {
val t = MyTwitterApiClient.start(session)
text.text = (
"Name: "+t.name
+"\nLocation: "+t.location
+"\nFriends: "+t.friendsCount
)
Picasso.with(baseContext).load(t.profileImageUrl).resize(250, 250).into(imageView)
}
通过测试,我发现成功方法和失败方法都没有被调用。而且我根本不理解为什么它不调用任何方法而只会失败。
如果这里的任何人已经使用过类似工具或对我有提示,那将非常有帮助!
问候
顺便说一句:最终使我的应用程序崩溃的错误是NullPointerException,因为未调用成功方法,并且最终返回了null。
粘贴到我的文件中:
MainActivity:https://pastebin.com/hWByYUFT
MyTwitterApiClient:https://pastebin.com/85xH284K
activity_main.xml:https://pastebin.com/vkzbkL81
答案 0 :(得分:1)
好的,从您的代码开始:
fun start(session: TwitterSession): User {
val userID = session.userId
var data: User? = null
MyTwitterApiClient(session).getCustomService().show(userID).enqueue(object : Callback<User>() {
override fun success(result: Result<User>?) {
data = result!!.data
}
override fun failure(exception: TwitterException?) {
throw exception!!
}
})
return data!!
}
在这里,您将返回data
,就好像它已被分配一样。您的TwitterApiClient执行异步任务,因此无法从data = result!!.data
正确读取数据
text.text = (
"Name: "+t.name
+"\nLocation: "+t.location
+"\nFriends: "+t.friendsCount
)
因为t
是null
。其数据尚未设置。将来,它将在异步回调success()
中。
您的主要问题似乎在于如何处理异步任务以及如何通知结果。关于它的大量资料。 LiveData
,RxJava
,EventBus
可能都是潜在客户。
顺便说一句,您的代码在MainActivity
中起作用的原因是因为您是在结果出现之后(在success()
中设置文本,所以t
很容易阅读。>
祝你好运,学习愉快!