在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?
Posted
技术标签:
【中文标题】在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?【英文标题】:Is it considered bad practice to change activities during an AsyncTask in Android?在 Android 的 AsyncTask 期间更改活动是否被认为是不好的做法? 【发布时间】:2018-04-08 02:22:25 【问题描述】:我正在使用 addListenerForSingleValueEvent()
方法调用我的 Firebase 数据库以从数据库中读取值。根据一些 SO 帖子,此方法实现为 AsyncTask
。在此方法中,我验证数据,并根据值调用finish()
。我知道AsyncTask
是用来处理 UI 元素的,但它是用来处理切换活动的吗?
我担心的是,由于它是异步运行的,因此此方法之外的代码可能会首先运行,并且如果该方法之外的代码包含切换活动(目前没有,但可能会发生变化),那么它可能会导致我的应用程序崩溃当它尝试在 addListenerForSingleValueEvent()
之后调用 finish()
时。
在使用AsyncTasks
时处理活动切换的最佳方式是什么?
【问题讨论】:
【参考方案1】:您可以在演示者内部启动异步任务,演示者将处理 Activity/Fragment 的生命周期。这是 MVP 架构
如果活动/片段被销毁,异步任务将在后台运行。所以在 onPostExecute 期间,它会崩溃。所以最好的做法是在演示者中保存活动/片段的状态,如果活动是活动的,演示者将提供活动回调以切换到新活动。
我举个例子
public interface BaseFirstActivity
void switchActivity();
public class FirstActivity extends AppCompatActivity implements BaseFirstActivity
FirstActivityPresenter firstActivityPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
firstActivityPresenter = new FirstAcitivtyPresenterImpl(this);
firstActivityPresenter.fetchDB();
@Override
public void switchActivity()
// do switching
@Override
protected void onDestroy()
firstActivityPresenter.onDestroy();
super.onDestroy();
public interface FirstActivityPresenter
void onDestroy();
void fetchDB();
public class FirstAcitivtyPresenterImpl implements FirstActivityPresenter
private BaseFirstActivity baseFirstActivity;
public FirstAcitivtyPresenterImpl(BaseFirstActivity baseFirstActivity)
this.baseFirstActivity = baseFirstActivity;
@Override
public void onDestroy()
baseFirstActivity = null;
@Override
public void fetchDB()
//do asyntask and after fetching
if (baseFirstActivity != null)
baseFirstActivity.switchActivity();
您可以使用 onStop 和 onResume 来分离和附加演示者。您也可以为 AsynTask 使用相同的回调机制作为单独的类
【讨论】:
以上是关于在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 中将 asynctask 代码更改为 rxandroid 代码?
在 onCreate() 期间通过 AsyncTask 加载数据