2017-01-18 8 views
0

あるとき。最初のフラグメントをクリックすると、Firebus DBから詳細を取得するためにDB呼び出しを非同期にする(Async)第2のフラグメントが生成されます。 DB呼び出しが完了すると、2番目のフラグメントにデータが移入されます。問題は、DBコールがまだ進行中のときに2番目のフラグメントの[戻る]ボタンをクリックしたときです。戻るボタンをクリックすると最初のフラグメントになりますが、DBコールが返されたときにアプリケーションがクラッシュします(2番目のフラグメントが使用できなくなったことがわかります)。私は、コードのどの部分がNULLポインタ例外をスローしているかを正確に見ることができますが、私はこの問題を処理する最良の方法を理解するのに助けが必要です。Androidの断片で利用できないDBの結果は、私が2つのフラグメントとアプリを持っているバック

DBコール

mDatabase = FirebaseDatabase.getInstance().getReference(DBReference); 
Query myQuery = mDatabase.orderByChild("title"); 

    myQuery.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 

      for (DataSnapshot postSnapshot : snapshot.getChildren()) { 
       ContactItem post = postSnapshot.getValue(ContactItem.class); 

       ContactItem item = new ContactItem(); 
       item.status = post.getStatus(); 
       item.title = post.getTitle(); 
       itemList.add(item); 
      } 
      // Transaction complete, sending to listener 
      dataListener.newDataReceived(itemList); 
     } 

コードするコードスニペットは、DB操作が完了すると、コールバックを受信する第2のフラグメントにスニペット。

public void newDataReceived(ArrayList<ContactItem> itemList) { 
    progressCircle.setVisibility(View.GONE); 
    adapter = new ContactItemAdapter(this.getActivity(), itemList, contactType); 

NULLポインタ例外が

public ContactItemAdapter(Context context, ArrayList<ContactItem> items, String contactType) { 
    mContext = context; 
    mDataSource = items; 
    mDataSourceCopy = new ArrayList<ContactItem>(mDataSource); 
    //Null pointer exception is thrown at below line 
    mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mType = contactType; 
    } 
+0

あなたの解決策は、あなたの問題です。あなたの非同期タスクが進行中で、あなたが戻るボタンを押した場合、非同期タスクは、まだ進行中の場合は、戻るボタンで最初に停止する必要があります。あなたの非同期タスクが完了した後、いくつかのUIタスクが実行されているので。 –

+0

AsyncTask.cancel()、asyncTaskをキャンセルする方法です。 –

+0

私はそれが非同期呼び出しであると誤解されたかもしれません。非同期で私は、アプリケーションがDBコールが進行中であっても、ユーザーがボタンを押すことを許可していることを意味した。 – dacscan3669

答えて

1

あなたの断片をあなたnewDataReceived方法における活性に添加されていることを確認スローアダプタコードは。あなたは、フラグメントからのコールバックでisAddedisDetachedまたはisRemovingを使用してこれを行うことができます。

public void newDataReceived(ArrayList<ContactItem> itemList) { 
    if(isAdded()){ 
    progressCircle.setVisibility(View.GONE); 
    adapter = new ContactItemAdapter(this.getActivity(), itemList, contactType); 
    } 
} 
+0

を得ます。フラグメントが追加されたかどうかを確認するにはどうすればよいですか? isDetachedとisRemovingは標準的なメソッドですか? – dacscan3669

+0

これらはFragmentクラスに組み込まれているので、DBリクエストからのコールバックでそれらを使用できるはずです。 https://developer.android.com/reference/android/app/Fragment.html#isAdded() –

+0

感謝。私は状態を印刷しようとしました、そして、それは正しくフラグメントの状態をキャプチャします。私はその周りに論理を構築します。再度、感謝します! – dacscan3669

関連する問題