【问题标题】: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 时处理活动切换的最佳方式是什么?

【问题讨论】:

    标签: android android-activity android-asynctask


    【解决方案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 使用相同的回调机制作为单独的类

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 2015-09-09
      • 2013-04-12
      • 2018-08-11
      • 2015-07-24
      • 1970-01-01
      相关资源
      最近更新 更多