2016-07-09 6 views
0

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.

+0

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

+0

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. –

+0

Die Listener-Callbacks werden immer im Hauptthread ausgeführt. Das Hinzufügen des Listeners zu einem Worker-Thread ändert das nicht. –

Antwort

0

Ich habe nicht getestet, aber das ist, wie ich es tun würde: `

final ArrayList<String> mEnteredPlayers = new ArrayList<>(); 

    mEntriesRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      new Thread(new Runnable() { 
       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); 
       } 
      }).start(); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 

    }); 

`

0

versuchen, den Faden zu entfernen und Ihren Code in der OnCreate Methode läuft .... wie dies

@Override geschützter void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main);

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) { 

     } 

}

+0

danke für die Antwort. Ich habe es ursprünglich in onCreate versucht und es hat den Thread eingefroren, weshalb ich gerade versuche, es in den Hintergrund zu verschieben. –

0

Verwenden Sie einen Handler:

protected static Handler sHandler = new Handler(); 

Verwenden Sie die Runnable Sie erstellt haben, wie es ist.

Dann statt:

Thread custListLoadThread = new Thread(runnable); 
custListLoadThread.start(); 

Verwendung:

sHandler.post(runnable); 
+0

Danke für die Antwort. Kein Glück. Für mich scheint es, als ob einer dieser funktionieren sollte –

+0

Mit keinem Glück meinst du der Code nicht ausgeführt oder meinst du es führt aber auch den UI Thread blockiert? – maddesa

+0

führt aus, blockiert aber den ui-Thread –