Activity类之外的Android上下文

时间:2012-03-15 17:55:02

标签: android android-activity android-context

我正在尝试处理我的应用程序中的异常。我正在尝试记录异常,然后使用Toast提醒用户存在问题。我在我的所有类中都有这个工作,它扩展了Activity。

但是,在任何没有扩展活动的类中,我都不能使用toast方法,因为我无法获取当前上下文。有没有一种简单的方法可以解决这个问题,还是我的班级应该扩展活动?

3 个答案:

答案 0 :(得分:16)

您只需传递Context 当您从Activity类调用Non-Activity类时调用Like

YourNonActivtyClass obj = new YourNonActivtyClass(Activity.this);

答案 1 :(得分:0)

我想出了使用RXJava和Kotlin的解决方案。不过,用Java重新创建它应该足够容易。这是一个单例类,仅具有一个getter和setter。 getter创建一个可观察的上下文实例,该实例由Activity通过setContext(context: Context)

设置
object AndroidContextObservable { // needs to be singleton. 

    private lateinit var context: Context

    fun context(): Observable<Context> {
        return Observable.create { subscriber ->
            subscriber.onNext(this.context)
            subscriber.onComplete()
        }
    }

    fun setContext(context: Context) {
        this.context = context
    }
}

说我有一个使用GoogleCalendars的服务:我首先要在活动中设置它:

class ViewMeetingRoomDataActivity : AppCompatActivity() {
    @Inject lateinit var googleCalendarsService: GoogleCalendarService // abstraction over the GoogleCalendarAPI Class (Below)

    private var subscriptions: Disposable = Disposable.empty()
    private lateinit var meetingRoomBundleData: ParcelableMeetingRoomData

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        AndroidContextObservable.setContext(this) // set the context here
        DaggerServiceModuleComponent.create().inject(this)

        setContentView(R.layout.activity_view_meeting_room_data)
    }

    override fun onPause() {
        super.onPause()

        this.subscriptions.dispose()
    }

}

然后因为可观察对象来自单个对象,因此我们可以在init生命周期挂钩中对其进行订阅。

@Module
class GoogleCalendarsApiServiceModule @Inject constructor(): IGoogleCalendarsApiServiceModule {

    private lateinit var googleCredential: Credential
    private lateinit var googleCalendarService: Calendar

    private val httpTransport: NetHttpTransport = NetHttpTransport()
    private val subscriptions: Disposable = Disposable.empty()

    init {
    // Subscribe to the context
        this.subscriptions.apply {
            AndroidContextObservable.context()
                .subscribe { context ->
                    googleCredential = GoogleCredentialsBuilder.getCredentials(httpTransport, context)
                    googleCalendarService = ServiceBuilder.buildGoogleCalendarService(googleCredential, httpTransport)
                }
        }
    }

    fun finalize() {
        this.subscriptions.dispose() // <-- Don't forget to discard Observables :)
    }
}

我喜欢这种解决方案,因为它是可测试的,并且上下文现在来自单一事实来源。这是我想到的从Activity之外获取上下文的最干净的方法。

希望我有所帮助。

答案 2 :(得分:-13)

Toast消息应该在应用程序上下文中工作,即

Toast.makeText(getApplicationContext(), ...);