首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重用由AsyncTask注入的Dagger2?

如何重用由AsyncTask注入的Dagger2?
EN

Stack Overflow用户
提问于 2018-02-25 10:03:56
回答 2查看 575关注 0票数 1

在它的onStart方法中,片段调用演示者来获取天气数据。演示程序启动一个AsyncTask,该AsyncTask获取数据,将其返回给演示者并显示在片段中。问题是,如果打开片段(并获取数据),切换到另一个活动,然后返回到该片段,则会得到以下错误:

代码语言:javascript
复制
Caused by: java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:605)
at android.os.AsyncTask.execute(AsyncTask.java:560)
at com.dev.weather.forecast.ForecastPresenter.fetchWeather(ForecastPresenter.kt:20)
at com.dev.weather.forecast.ForecastFragment.refreshWeather(ForecastFragment.kt:83)
at com.dev.weather.forecast.ForecastFragment.onStart(ForecastFragment.kt:105)
at android.support.v4.app.Fragment.performStart(Fragment.java:2287)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1458)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3227)
at android.support.v4.app.FragmentManagerImpl.dispatchStart(FragmentManager.java:3186)
at android.support.v4.app.FragmentController.dispatchStart(FragmentController.java:203)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:582)
at android.support.v7.app.AppCompatActivity.onStart(AppCompatActivity.java:177)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1256)
at android.app.Activity.performStart(Activity.java:6959)
at android.app.Activity.performRestart(Activity.java:7075)
at android.app.Activity.performResume(Activity.java:7080)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3768)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3832) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:154) 
at android.app.ActivityThread.main(ActivityThread.java:6682) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

在切换到匕首之前,我没有这个问题,但是现在匕首只创建了AsyncTask的一个实例,我不知道如何修复它。

我希望有人能帮我!

片段:

代码语言:javascript
复制
@ActivityScoped
class ForecastFragment @Inject constructor(): DaggerFragment(), ForecastContract.View {

    @Inject
    lateinit var presenter: ForecastContract.Presenter

    override fun refreshWeather() {
        ...
        presenter.fetchWeather(location, unitType)
    }

    override fun onStart() {
        super.onStart()
        refreshWeather()
    }
}

主持人:

代码语言:javascript
复制
@ActivityScoped
class ForecastPresenter @Inject constructor() : ForecastContract.Presenter, FetchWeatherTask.AsyncResponse {

    @Inject
    lateinit var fetchWeatherTask: FetchWeatherTask

    override fun fetchWeather(location: String, unitType: String) {
        fetchWeatherTask.execute(location, unitType)
    }
    ...
}

AsyncTask:

代码语言:javascript
复制
class FetchWeatherTask @Inject constructor(private var client: OkHttpClient): AsyncTask<String, Void, MutableList<String>>() {
    ...
    override fun onPostExecute(result: MutableList<String>) {
        returnWeather()
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-25 10:15:32

您的AsyncTask与您的ForecastFragment生命周期相关联。只要您的片段存在,您将拥有相同的fetchWeatherTask实例。

你不应该注入你的任务。相反,每次你需要的时候都要创建一个新的。

票数 2
EN

Stack Overflow用户

发布于 2018-02-25 10:34:57

如前所述,您不能重用AsyncTask,因此不应该直接注入它。

相反,您可以做的是注入一个Provider<FetchWeatherTask>,它将在每次调用provider.get()-as时创建一个新任务,只要您不对其进行调整,在这种情况下,您总是会得到相同的对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48972297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档