在它的onStart方法中,片段调用演示者来获取天气数据。演示程序启动一个AsyncTask,该AsyncTask获取数据,将其返回给演示者并显示在片段中。问题是,如果打开片段(并获取数据),切换到另一个活动,然后返回到该片段,则会得到以下错误:
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的一个实例,我不知道如何修复它。
我希望有人能帮我!
片段:
@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()
}
}主持人:
@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:
class FetchWeatherTask @Inject constructor(private var client: OkHttpClient): AsyncTask<String, Void, MutableList<String>>() {
...
override fun onPostExecute(result: MutableList<String>) {
returnWeather()
}
}发布于 2018-02-25 10:15:32
您的AsyncTask与您的ForecastFragment生命周期相关联。只要您的片段存在,您将拥有相同的fetchWeatherTask实例。
你不应该注入你的任务。相反,每次你需要的时候都要创建一个新的。
发布于 2018-02-25 10:34:57
如前所述,您不能重用AsyncTask,因此不应该直接注入它。
相反,您可以做的是注入一个Provider<FetchWeatherTask>,它将在每次调用provider.get()-as时创建一个新任务,只要您不对其进行调整,在这种情况下,您总是会得到相同的对象。
https://stackoverflow.com/questions/48972297
复制相似问题