访问Twitter REST API仅在mainActivity中有效,但是为什么呢?

时间:2019-05-09 11:49:54

标签: android kotlin twitter retrofit2

我真的很困惑,需要您的帮助!这只是我的第二个应用程序,也是我第一次使用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。

粘贴到我的文件中:

1 个答案:

答案 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
            )

因为tnull。其数据尚未设置。将来,它将在异步回调success()中。

您的主要问题似乎在于如何处理异步任务以及如何通知结果。关于它的大量资料。 LiveDataRxJavaEventBus可能都是潜在客户。

顺便说一句,您的代码在MainActivity中起作用的原因是因为您是在结果出现之后(在success()中设置文本,所以t很容易阅读。

祝你好运,学习愉快!