我使用addListenerForSingleValueEvent()
方法拨打我的Firebase数据库,以便从数据库中读取值。根据一些SO帖子,此方法实现为AsyncTask
。在此方法中,我验证数据,并根据值,可以调用finish()
。我知道AsyncTask
旨在处理UI元素,但它是否意味着处理切换活动?
我担心的是,因为它是异步运行的,所以此方法之外的代码可能首先运行,如果外部代码包含切换活动(目前它没有,但可能会有变化),那么它可能会导致我的应用程序崩溃当它试图在finish()
之后调用addListenerForSingleValueEvent()
之后。
使用AsyncTasks
时处理活动切换的最佳方法是什么?
答案 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 的相同回调机制用作单独的类