1

私は iBeacon ライブラリ バージョン 0.6 を使用していましたが、監視以外はすべて問題ありませんでした。そのバージョンでは監視が行われていましたが、ライブラリが「暗黙の意図」を使用してこの情報を渡すため、監視通知コールバックが呼び出されませんでした。IBeacon が警告を受け取る問題を参照してください。 MonitorNotifier のコールバックで暗黙的な意図は安全ではありません

最近、iBeacon android ライブラリのバージョン 0.7.6 にアップグレードしたところ、コールバックの監視の問題は解決しましたが、このアップグレードで新たな問題が見つかりました。android.view.ViewRootImpl$CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

範囲通知コールバック内でアプリのメソッドを呼び出しています。UI スレッド内でラップしている場合、その例外は発生しませんが、アプリのパフォーマンスが低下します。

ここにコードがあります

BackgroundRangingFragment.java

 @Override
 public void onIBeaconServiceConnect() {
   //Ranging Notifier
   iBeaconManager.setRangeNotifier(new RangeNotifier() {
      @Override 
      public void didRangeBeaconsInRegion(Collection<IBeacon> iBeacons, Region region) {
        //If beacon found in the specified Region.
        if (iBeacons.size() > 0) {
            MainActivity main = (MainActivity)MainActivity.mainActivityInstance;  
            main.setActiveBeaconsFromBackgroundRangingFragment(iBeacons);
        }
     }
 }

MainActivity.java

public void setActiveBeaconsFromBackgroundRangingFragment(List<Beacon> tempActiveBeaconArrayList){
    this.activeBeaconArrayList.clear();
    activeBeaconArrayList.addAll(tempActiveBeaconArrayList);
    MainRangingFragmennt fragment = (MainRangingFragmennt)getSupportFragmentManager().findFragmentByTag("beaconLogFragment");
    if(fragment != null){
        fragment.setActiveBeaconListForBeaconLogFromBackgroundRangingData(this.activeBeaconArrayList);
    }

MainRangingFragment.java

//Refreshes Beacon log 
public void setActiveBeaconListForBeaconLogFromBackgroundRangingData(List<Beacon> activeBeacons){
    //Here I am updating view with currently active beacons.
    LinearLayout progressBar = (LinearLayout)this.view.findViewById(R.id.beacon_log_list_progress);
        progressBar.setVisibility(View.VISIBLE);  //This line is raising exception .
        //code continues ...
}

例外メッセージ。

04-22 18:10:15.546: E/isNull(1435): MainRangingFragmennt{421408c0 #2 id=0x7f0c0021 beaconLogFragment}
04-22 18:10:15.546: W/dalvikvm(1435): threadid=19: thread exiting with uncaught exception (group=0x4186fba8)
04-22 18:10:15.546: E/AndroidRuntime(1435): FATAL EXCEPTION: IntentService[IBeaconIntentProcessor]
04-22 18:10:15.546: E/AndroidRuntime(1435): Process: com.example.ranging, PID: 1435
04-22 18:10:15.546: E/AndroidRuntime(1435): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:824)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.support.v4.widget.DrawerLayout.requestLayout(DrawerLayout.java:762)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:352)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.requestLayout(View.java:16431)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.setFlags(View.java:8908)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.view.View.setVisibility(View.java:6036)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at com.example.ranging.MainRangingFragmennt.setActiveBeaconListForBeaconLogFromBackgroundRangingData(MainRangingFragmennt.java:309)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at com.example.ranging.MainActivity.setActiveBeaconsFromBackgroundRangingFragment(MainActivity.java:497)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at com.example.ranging.BackgroundRanging$4.didRangeBeaconsInRegion(BackgroundRanging.java:489)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at com.radiusnetworks.ibeacon.IBeaconIntentProcessor.onHandleIntent(IBeaconIntentProcessor.java:73)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.os.Handler.dispatchMessage(Handler.java:102)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.os.Looper.loop(Looper.java:136)
04-22 18:10:15.546: E/AndroidRuntime(1435):     at android.os.HandlerThread.run(HandlerThread.java:61)

フラグメントを使用して UI にビーコン データをロードしています。

4

1 に答える 1