UIスレッドをフリーズしているonCreate()にいくつかのコードがあります。私はそれをバックグラウンドで実行させるために見つけることができるあらゆる方法でそれを入れてみました。私が考えることができるのは、コードがバックグラウンドで実行されているにもかかわらず、バックグラウンドが更新されている間に他のリスナーがアクティビティをフリーズしているということです。あるいは、私のコードが実際に背景に到達していないのでしょうか?誰にも何か提案はありますか?ここAndroidの背景タスクがUIスレッドをフリーズさせる - Firebaseを更新する
AsyncTask.execute(new Runnable() {
@Override
public void run() {
//tried it here
}
});
////////
Thread thread = new Thread() {
@Override
public void run() {
//tried it here
}
});
thread.start();
/////
Runnable runnable = new Runnable() {
@Override
public void run() {
//tried it here
}
};
AsyncTask.execute(runnable);
///コードがあります。私はこの時点でこれを試しています。
Thread custListLoadThread = new Thread(runnable);
custListLoadThread.start();
}
private Runnable runnable = new Runnable() {
@Override
public void run() {
mSelectedPlayerRef.child(mSelectedPlayer.getUsername()).setValue(mEmptyResultsItems);
final ArrayList<String> mEnteredPlayers = new ArrayList<>();
mEntriesRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot entries: dataSnapshot.getChildren()){
Player player = entries.getValue(Player.class);
mEnteredPlayers.add(player.getUsername());
Player draftedPlayer = entries.getValue(Player.class);
mEntriesRef.child(draftedPlayer.getUsername()).child("VS")
.child(mSelectedPlayer.getUsername()).setValue(mEmptyResultsItems);
}
for(String enteredPlayer: mEnteredPlayers){
mSelectedPlayerRef.child(enteredPlayer).setValue(mEmptyResultsItems);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
};
これらのすべてがUIスレッドをフリーズしています。
はあなたが何をしてハングhttps://developer.android.com/studio/profile/am-methodtrace.htmlようにして確認しましたメインスレッド?私はfirebaseの仕組みが分からないが、あなたのアプリをフリーズしないように設計されていると思われる。 'onDataChange'コールバックはメインスレッドで実行される可能性があり、そこのコードがフリーズした場合、コールバックでスレッドを開始する必要があります。 – zapl
メソッドトレースは私にとっては新しいものです。このような状況では役に立つと思われますが、私はそれを使いこなして、その仕組みを理解しようとします。 –
リスナーコールバックは常にメインスレッド上で実行されます。ワーカースレッドにリスナーを追加しても、それは変更されません。 –