在Android中的AsyncTask期间更改活动被认为是不好的做法吗?

时间:2017-10-26 15:55:52

标签: android android-activity android-asynctask

我使用addListenerForSingleValueEvent()方法拨打我的Firebase数据库,以便从数据库中读取值。根据一些SO帖子,此方法实现为AsyncTask。在此方法中,我验证数据,并根据值,可以调用finish()。我知道AsyncTask旨在处理UI元素,但它是否意味着处理切换活动?

我担心的是,因为它是异步运行的,所以此方法之外的代码可能首先运行,如果外部代码包含切换活动(目前它没有,但可能会有变化),那么它可能会导致我的应用程序崩溃当它试图在finish()之后调用addListenerForSingleValueEvent()之后。

使用AsyncTasks时处理活动切换的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以在演示者中启动Async Task,演示者将处理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 的相同回调机制用作单独的类