2016-07-09 6 views
0

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スレッドをフリーズしています。

+0

はあなたが何をしてハングhttps://developer.android.com/studio/profile/am-methodtrace.htmlようにして確認しましたメインスレッド?私はfirebaseの仕組みが分からないが、あなたのアプリをフリーズしないように設計されていると思われる。 'onDataChange'コールバックはメインスレッドで実行される可能性があり、そこのコードがフリーズした場合、コールバックでスレッドを開始する必要があります。 – zapl

+0

メソッドトレースは私にとっては新しいものです。このような状況では役に立つと思われますが、私はそれを使いこなして、その仕組みを理解しようとします。 –

+0

リスナーコールバックは常にメインスレッド上で実行されます。ワーカースレッドにリスナーを追加しても、それは変更されません。 –

答えて

0

は、私はこれをテストしていませんが、これは、私はそれを行うだろうかです:のような.... `

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

がスレッドを削除しようとすると、OnCreateの方法でコードを実行しますこの

@Override保護ボイドのonCreate(バンドル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

私はもともとonCreateで試してみましたが、それはバックグラウンドに移動しようとしているのです。 –

0

ハンドラを使用します。

protected static Handler sHandler = new Handler(); 

は、あなたがあるとして作成したのRunnableを使用してください。その後

の代わり:

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

使用:

sHandler.post(runnable); 
+0

返事をありがとう。運がない。私にとっては、これらのいずれかがうまくいくように思えます。 –

+0

コードが実行されないか、実行されることを意味するのですか? – maddesa

+0

は実行しますが、uiスレッドをブロックします –

関連する問題