AllJoyn を使用して Lifx 電球に接続し、この電球を制御する機能を提供する Android アプリを作成しています。チュートリアル アプリと AllJoyn のサンプル アプリを使用して、Lightning SDK を基礎として示しました。
アプリが読み込まれると、ネットワーク上の現在の電球のリストがユーザーに提供されます。アプリが (ホーム キーではなくバック キーを使用して) バックグラウンドに送信されてから再開されると、LightingDirector はあたかもライトがないかのように空の配列を返しますが、その理由はわかりません。Android ライティング チュートリアル アプリも、バックグラウンドから再開したときに電球が表示されないことに気付いたので、SDK のバグが疑われます。
これを修正するために、現在 onDestroy() メソッドで System.exit(0) を使用して問題を解決していますが、これは良い解決策ではありません。これを解決する方法を知っている人はいますか?
public class MainActivity extends AppCompatActivity implements NextControllerConnectionListener {
private static final int CONTROLLER_CONNECTION_DELAY = 5000;
public LightingDirector lightingDirector;
private ListView lv;
private ItemListView lampAdapter;
private ArrayList<Lamp> lamps = new ArrayList<Lamp>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.initViews();
// STEP 1: Initialize a lighting controller with default configuration.
LightingController lightingController = LightingController.get();
lightingController.init(new LightingControllerConfigurationBase(getApplicationContext().getFileStreamPath("").getAbsolutePath()));
lightingController.start();
// STEP 2: Instantiate the director, add the custom listener, then start.
lightingDirector = LightingDirector.get();
lightingDirector.setNetworkConnectionStatus(true);
lightingDirector.postOnNextControllerConnection(this, CONTROLLER_CONNECTION_DELAY);
lightingDirector.start("TutorialApp");
}
private void initViews() {
lv = (ListView) findViewById(R.id.list);
lampAdapter = new ItemListView(this, this.lamps);
lv.setAdapter(lampAdapter);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
goToPage2(position);
//send which one I have clicked on
}
});
}
private void goToPage2(int position) {
Intent dbIntent2 = new Intent(this, BulbSettingActivity.class);
dbIntent2.putExtra("position", position);
startActivity(dbIntent2);
}
@Override
public void onControllerConnected() {
Lamp[] lightingDirectorLamps = lightingDirector.getLamps();
if (lightingDirectorLamps.length > 0) {
// clear out whatever is in there
this.lamps.clear();
// add the lamps back
for (Lamp lamp : lightingDirectorLamps) {
this.lamps.add(lamp);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
lampAdapter.notifyDataSetChanged();
}
});
}
}
@Override
protected void onDestroy() {
lightingDirector.stop();
System.exit(0);
super.onDestroy();
}
}
LFS チュートリアル アプリでは、次の例外が発生します。
02-19 10:02:44.746 16855-16885/org.allseen.lsf.tutorial I/System.out: AllJoynManager.stop(): 成功
02-19 10:02:44.771 16855-16885/org.allseen.lsf.tutorial I/System.out: AllJoynManager.destroy()
02-19 10:02:50.496 16855-16855/org.allseen.lsf.tutorial E/AndroidRuntime: 致命的な例外: メイン
プロセス: org.allseen.lsf.tutorial、PID: 16855
java.lang.RuntimeException: アクティビティ ComponentInfo を開始できません {org.allseen.lsf.tutorial/org.allseen.lsf.tutorial.TutorialActivity}: java.lang.NullPointerException: 仮想メソッド 'void java.lang.Thread. null オブジェクト参照での interrupt()'
Android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3231) で
Android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3327) で
android.app.ActivityThread.access$1100(ActivityThread.java:221) で
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1771) で
android.os.Handler.dispatchMessage(Handler.java:102) で
android.os.Looper.loop(Looper.java:158)
android.app.ActivityThread.main(ActivityThread.java:7144) で
java.lang.reflect.Method.invoke(ネイティブ メソッド) で
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:731) で
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:621) で
原因: java.lang.NullPointerException: null オブジェクト参照で仮想メソッド 'void java.lang.Thread.interrupt()' を呼び出そうとしました
org.allseen.lsf.sdk.manager.DefaultLightingSystemQueue.stop (DefaultLightingSystemQueue.java:116) で
org.allseen.lsf.sdk.manager.LightingSystemManager.setQueue (LightingSystemManager.java:231) で
org.allseen.lsf.sdk.manager.LightingSystemManager.init (LightingSystemManager.java:156) で
org.allseen.lsf.sdk.LightingDirector.start (LightingDirector.java:444) で
org.allseen.lsf.sdk.LightingDirector.start (LightingDirector.java:400) で
org.allseen.lsf.tutorial.TutorialActivity.onCreate (TutorialActivity.java:58) で
android.app.Activity.performCreate(Activity.java:6840) で
android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1135) で
Android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3184) で
Android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3327) で
android.app.ActivityThread.access$1100(ActivityThread.java:221) で
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1771) で
android.os.Handler.dispatchMessage(Handler.java:102) で
android.os.Looper.loop(Looper.java:158)
android.app.ActivityThread.main(ActivityThread.java:7144) で