在 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();


您可以使用 onStoponResume 来分离和附加演示者。您也可以为 AsynTask 使用相同的回调机制作为单独的类

【讨论】:

以上是关于在 Android 的 AsyncTask 期间更改活动是不是被认为是不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 中将 asynctask 代码更改为 rxandroid 代码?

在 onCreate() 期间通过 AsyncTask 加载数据

Android AsyncTask分析

Android中使用AsyncTask实现文件下载以及进度更新提示

最佳实践:方向更改期间的 AsyncTask

如何在屏幕旋转期间处理 AsyncTask?