我正在尝试处理我的应用程序中的异常。我正在尝试记录异常,然后使用Toast提醒用户存在问题。我在我的所有类中都有这个工作,它扩展了Activity。
但是,在任何没有扩展活动的类中,我都不能使用toast方法,因为我无法获取当前上下文。有没有一种简单的方法可以解决这个问题,还是我的班级应该扩展活动?
答案 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(), ...);