あるとき。最初のフラグメントをクリックすると、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;
}
あなたの解決策は、あなたの問題です。あなたの非同期タスクが進行中で、あなたが戻るボタンを押した場合、非同期タスクは、まだ進行中の場合は、戻るボタンで最初に停止する必要があります。あなたの非同期タスクが完了した後、いくつかのUIタスクが実行されているので。 –
AsyncTask.cancel()、asyncTaskをキャンセルする方法です。 –
私はそれが非同期呼び出しであると誤解されたかもしれません。非同期で私は、アプリケーションがDBコールが進行中であっても、ユーザーがボタンを押すことを許可していることを意味した。 – dacscan3669