2017-10-26 8 views
0

addListenerForSingleValueEvent()メソッドを使用してFirebaseデータベースを呼び出して、データベースから値を読み取ります。このメソッドは、いくつかのSO投稿に従ってAsyncTaskとして実装されています。このメソッドでは、データを検証し、値に基づいてfinish()を呼び出すことができます。私はAsyncTaskがUI要素を扱うことを意図していますが、それはスイッチング活動を扱うことを意味していますか?AndroidのAsyncTaskでアクティビティを変更することは悪い習慣と考えられますか?

私の懸念は、非同期的に実行されているため、このメソッドの外部にあるコードが最初に実行され、そのコードに切り替えアクティビティが含まれている場合(現在はそうではありませんが変更の可能性があります)アプリの中にfinish()addListenerForSingleValueEvent()の中に呼び出そうとするとアプリになります。

AsyncTasksの使用中にアクティビティの切り替えを処理するには、どのような方法が最適ですか?

答えて

0

プレゼンター内で非同期タスクを開始することができ、プレゼンターはアクティビティー/フラグメントのライフサイクルを処理します。これはMVPアーキテクチャ

アクティビティ/フラグメントが破棄されると、非同期タスクがバックグラウンドで実行されます。したがって、onPostExecute中にクラッシュします。したがって、プレゼンターの中にアクティビティ/フラグメントの状態を保存することがベストプラクティスです。プレゼンターは、アクティビティがライブであれば、新しいアクティビティに切り替えるためのアクティビティへのコールバックを提供します。

は、私はあなたがプレゼンターをデタッチし添付するonStoponResumeを使用することができます

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

例をお見せしましょう。また、同じコールバックメカニズムをAsynTask別のクラスとして使用することができます

関連する問題