Ich habe Code in onCreate(), der den UI-Thread einfriert. Ich habe versucht, es so zu gestalten, dass es im Hintergrund ausgeführt wird. Ich kann nur daran denken, dass ich andere FireBase-Ereignis-Listener im Haupt-UI-Thread habe, also obwohl der Code im Hintergrund ausgeführt wird, frieren die anderen Listener die Aktivität ein, während der Hintergrund aktualisiert wird. Oder vielleicht kommt mein Code nicht wirklich zum Hintergrund? Hat jemand irgendwelche Vorschläge?Android-Hintergrundaufgabe friert UI-Thread ein - Firebase wird aktualisiert
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);
/// hier ist der Code. Ich versuche es gerade so.
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) {
}
});
}
};
Alle diese frieren den UI-Thread ein.
Haben Sie mit wie geprüft https://developer.android.com/studio/profile/am-methodtrace.html was hängt in der Hauptfaden? Ich bin mir nicht sicher, wie Firebase funktioniert, aber ich vermute, dass es nicht Ihre App einfrieren soll. Der 'onDataChange'-Callback kann möglicherweise im Hauptthread ausgeführt werden und wenn Ihr Code dort eingefroren ist, müssen Sie möglicherweise einen Thread im Callback starten. – zapl
die Methode Trace ist neu für mich. Es sieht so aus, als könnte es in dieser Situation nützlich sein, aber ich muss damit herumspielen und versuchen herauszufinden, wie es funktioniert. –
Die Listener-Callbacks werden immer im Hauptthread ausgeführt. Das Hinzufügen des Listeners zu einem Worker-Thread ändert das nicht. –