0

初めまして、Android環境は初心者なので意味不明なことを言ってしまい申し訳ありません。

現在の状況

MainActivityGraphActivityの 2 つのアクティビティを持つアプリケーションを実行しています 。

また、両方のアクティビティを知ってもらいたいクラス BLEConnection があります。MainActivity にはボタンが 1 つしかありません。

ボタンの onClick():

GraphActivity graph_activity = new GraphActivity();
BLEConnection radino_right = new BLEConnection(mainThread, graph_activity);
btnConnect.setText("Connecting");

クラス BLEConnection には BluetoothGattCallback() オブジェクトがあり、 onConnectionStateChange() を検出すると、MainActivity で実行されているスレッドを呼び出します。

Bluetooth デバイスが接続されている場合 (文字列 connect_status = "Connected")、このスレッドはインテントを作成し、startActivity() を実行します。

MainActivity で実行中のスレッド:

Thread mainThread = new Thread(new Runnable() {
    @Override
    public void run() {
        if(connect_status.equals("Connected")){
            Intent nextScreen = new Intent(getApplicationContext(), ((Object) graph_activity).getClass());
            //startActivityForResult() instead of startActivity() because I want to finish() it from the MainActivity if the connection with the device is closed.
            startActivityForResult(nextScreen,1);
        }
        else{
            if(nextScreen != null){
                finishActivity(1);
            }
        }
    }
});

トラブルシューティング

私が抱えているトラブルシューティングは、MainActivity に属し、BLEConnection に渡したオブジェクト graph_activity が、startActivity() メソッドで起動される実際の G​​raphActivity と一致しないことに気付いたことです。

どうすればこれを解決できるか知っている人はいますか?

アクティビティ オブジェクトを作成するときに「新規」を実行すると、新しいスレッド GraphActivity が生成され、startActivity() を呼び出すと、同じクラスの別のスレッドが生成されますが、以前に作成したオブジェクトとはリンクされていないと思います前。それを解決する方法がわかりません。

4

1 に答える 1

0

わかりました、少しリファクタリングする必要があると思います。確かに、グラフアクティビティの 2 つの異なるインスタンスを作成します。最初のものは必要ありません。

次のようなリスナーでシングルトンを使用できます。

1 BLEConnection をシングルトンにします。

public class BLEConnection {
    private static BLEConnection singletonInstance = new BLEConnection();

    private BLEConnection() {} //constructor cannot be called from outside

    public static BLEConnection getInstance() {
        return singletonInstance;
    }

    (... your Stuff here)
}

これで BLEConnection はメモリに残り、呼び出すと常に同じインスタンスが取得されます

BLEConnection bleconnection = BLEConnection.getInstance(); 

アプリのどこからでも。

2 リスナー インターフェイスを作成します。

public interface BLEConnectionListener {
    void statusUpdated(String newStatus);
    //you can write more functions here. Every activity from step 3 has to implement them
}

3 アクティビティにインターフェイスを実装させます。

public class MainActivity implements BLEConnectionListener {
    public void statusUpdated(String newStatus) {
        //do your thread thing here if you want to...
    }
}

public class GraphActivity implements BLEConnectionListener {
    public void statusUpdated(String newStatus) {
        //do graph stuff here
    }
}

4 インターフェイスについて BLEConnection に通知します。

onResume / onPause の MainActivity と GraphActivity:

public void onResume() {
    // bla
    BLEConnection bleConnection = BLEConnection.getInstance(); 
    bleConnection.addListener(this);
}

public void onPause() {
    // bla
    BLEConnection bleConnection = BLEConnection.getInstance(); 
    bleConnection.removeListener(this);
}

BLEコネクションの更新

public class BLEConnection {

    private ArrayList<BLEConnectionListener> listeners = new ArrayList<BLEConnectionListener>();

    public void addListener(BLEConnectionListener listener) {
        if (!listeners.contains(listener)) {
            listeners.add(listener);
        }
    }

    public void removeListener(BLEConnectionListener listener) {
        if (listeners.contains(listener)) {
            listeners.remove(listener);
        }
    }

    public void forwardStatusUpdate(String statusString) {
        for (BLEConnectionListener listener: listeners) {
            listener.statusUpdated(statusString);
        }
    }
}

これが理解できることを願っています。BLEConnection で、次の呼び出しができるようになりました

forwardStatusUpdate("Connected");

すべてのリスナー (= アクティブなアクティビティ) にステータスを通知します。

于 2015-12-16T11:41:13.583 に答える