2016-08-23 7 views
0

whileループをonCreateメソッド内に作成しようとしていますが、ループがうまく動作しないまま常にクラッシュします。誰か助けてくれますか?oncreateメソッドでwhileループをandroidに挿入する

これはコードである:お奨めした修正後

  while(runnersNearby.size()<3) 
{ 
      GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(lat, lang), radius); 
      geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() { 
       @Override 
       public void onKeyEntered(String key, GeoLocation location) { 
        Toast.makeText(UserProfile.this, "Successfully Found"+key, Toast.LENGTH_SHORT).show(); 
        if (key != user.getUid()) 
         runnersNearby.add(key); 
        Log.d("Number of users", String.valueOf(runnersNearby.size())); 
        Log.d("KEY", String.valueOf(key)); 
       } 

       @Override 
       public void onKeyExited(String key) { 
        Toast.makeText(UserProfile.this, "left the place", Toast.LENGTH_SHORT).show(); 
        runnersNearby.remove(key); 
       } 

       @Override 
       public void onKeyMoved(String key, GeoLocation location) { 
        Toast.makeText(UserProfile.this, "key moved but here", Toast.LENGTH_SHORT).show(); 
       } 

       @Override 
       public void onGeoQueryReady() { 
        System.out.println("All initial data has been loaded and events have been fired!"); 
       } 

       @Override 
       public void onGeoQueryError(DatabaseError error) { 
        Toast.makeText(UserProfile.this, "Error Occured", Toast.LENGTH_SHORT).show(); 
       } 
      }); 
radius=radius*1.5; 
     } 

logcat:

08-23 16:53:37.979 10116-10116/com.firebase.shahaf.datasignin E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: com.firebase.shahaf.datasignin, PID: 10116 
                       java.lang.RuntimeException: Unable to start activity ComponentInfo{com.firebase.shahaf.datasignin/com.firebase.shahaf.datasignin.UserProfile}: java.lang.IllegalArgumentException: Precision of GeoHash must be larger than zero! 
                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) 
                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) 
                        at android.app.ActivityThread.access$800(ActivityThread.java:148) 
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:135) 
                        at android.app.ActivityThread.main(ActivityThread.java:5272) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at java.lang.reflect.Method.invoke(Method.java:372) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 
                       Caused by: java.lang.IllegalArgumentException: Precision of GeoHash must be larger than zero! 
                        at com.firebase.geofire.core.GeoHash.<init>(GeoHash.java:29) 
                        at com.firebase.geofire.core.GeoHashQuery.queriesAtLocation(GeoHashQuery.java:85) 
                        at com.firebase.geofire.GeoQuery.setupQueries(GeoQuery.java:224) 
                        at com.firebase.geofire.GeoQuery.addGeoQueryEventListener(GeoQuery.java:325) 
                        at com.firebase.shahaf.datasignin.UserProfile.onCreate(UserProfile.java:68) 
                        at android.app.Activity.performCreate(Activity.java:5977) 
                        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
                        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) 
                        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365)  
                        at android.app.ActivityThread.access$800(ActivityThread.java:148)  
                        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)  
                        at android.os.Handler.dispatchMessage(Handler.java:102)  
                        at android.os.Looper.loop(Looper.java:135)  
                        at android.app.ActivityThread.main(ActivityThread.java:5272)  
                        at java.lang.reflect.Method.invoke(Native Method)  
                        at java.lang.reflect.Method.invoke(Method.java:372)  
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)  
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)  
+0

なぜクラッシュしましたか? LogCatにはどのような例外が記録されていますか? – Thorben

+0

logcat stacktraceを追加してください。 – SripadRaj

+0

すべてのユーザーのクエリは、半径でソートされていて、少なくとも3つにしたい場合は最初に3をとります。 –

答えて

1

あなたは、whileループを使用しないでください、それはで動作カントそれは別の関数を作成し、onGeoQueryReady()の下にそれを呼び出すために、ifの代わりにif(whileではなく)を実行する必要があります。

4

無限ループ。あなたはループしている(runnersNearby.size()< 3)。しかし、配列のサイズは決して変化しません。だから永遠にループする。そのため、あなたのonCreateは決して戻ってこないので、何かが間違っていると仮定しているので、あなたの活動を作成するのに時間がかかり過ぎるとシステムは最終的にあなたを殺します。

私はあなたがしたいと思っているのは、runnersNearbyアレイのループです。

runnersNearbyが変更できるコードには1つの場所がありますが、その場所は非同期コールバックにあります。実際には決して呼び出されません。ずっと後で。

+0

半径が変わってから変更する必要があります(その行をコピーするのを忘れています...)、半径が変更されてより多くのユーザーが見つかりました....(確かに動作します...)問題ではないので... – secret

+0

問題です。半径を変更しても配列のサイズは変わりません。あなたは無限にループしています。これはUIスレッドでは許可されておらず、onCreateや他のライフサイクル機能では許可されていません。 –

+0

半径が変わると、より多くのユーザーが見つかりました....(リストに追加されています) – secret

0

関連するすべてのインターネット/ネットワークをAsyncTasks doInBackgroundに置き、OnPostExecute(...)にEventListenerを追加します。ただのonCreateでAsynctaskを開始し、あなたのアプリがでキックするのEventListenerのを待ちましょうより

編集:迅速かつ汚いコード例:

public class yourClass probablyExtends Activity{ 
    onCreate(...){ 
     new LoadRunners().execute(); 
     NothingToSeeHereMoveAlongAndFollowYourUsualBusiness(); 
    } 
} 

public class LoadRunners extends AsyncTask { 

    doInBackground(..){ 
     double radius = 1.0; 
     while(runnersNearby.size()<3){ 
      loadRunners(radius); 
      if(runnersNearby.size()<3) 
       radius*=1.5; 
     } 
    } 
    onPostExecute(...){ 
     addEventListeners(); 
    } 
} 
関連する問題