2017-09-25 5 views
0

私はBluetoothでセンサーを読み取るモバイルアプリケーションを作成する必要があるプロジェクトに取り組んでいます。私はすでにBluetooth接続をコーディングしています。私は正常にセンサーに接続し、受信したデータをプリントアウトできます。私が接続したら、すぐ下のコードに示すように入力ストリームを聞き取ります。Androidプログラミングは、クラスからフラグメントへの連続データを送信します

私の問題は、このデータをフラグメントに正しく送信する方法がわかりません。通常はインテントを使用してデータを送信しますが、データを連続して受信するため、このメソッドを使用することはできません。私は数日間、これのための解決策を見つけるために苦労してきたので、あらゆる解決策や提案が高く評価されています。

現在のプロジェクト構造:

MainActivity.classは、SensorConnector.classのインスタンスを作成します。

SensorConnector.class、センサーを読み取るスレッドを作成します。

 public void run() { 
     byte[] buffer = new byte[1024]; 
     int bytes; 
     // Keep listening to the InputStream while connected 
     while (true) { 
      try { 
       // Read from the InputStream 
       bytes = mmInStream.read(buffer); 
       String incomingMessage = new String(buffer, 0, bytes); 

       // Code to send incomingMessage to Dataview 

      } catch (IOException e) { 
       Log.d(TAG, "disconnected " + e); 
       break; 
      } 
     } 
    } 

DataviewFragment.class、私は私のsensordataを送りたいと思いフラグメント:そうのような。読み取りセンサーデータで継続的に更新したいテキストボックスが含まれています。

DataviewActivity.class、Dataviewフラグメントを実装します。

答えて

2

これを行うにはいくつかの方法がありますが、単純なインターフェイスとオブザーバーパターンを使用して作業します。

1)インターフェイスを定義します。

public interface SensorListener { 
    void onUpdate(String incomingMessage); 
} 

2)あなたのMainActivityDataViewフラグメントがインタフェースを実装してください:

フラグメント:

public class DataView extends Fragment implements SensorListener { 
    // or however its setup 
    @Override public void onUpdate(String incomingMessage) { 
     // Do whatever you need - use runOnUiThread if touching views 
    } 
} 

活動:(注FragmentManager多分バージョンをサポート、findFragmentByTagfindFragmentById、再度あなたの設定を知らない)

public class MainActivity extends Activity implements SensorListener { 
// or whatever your current setup is 

    @Override public void onUpdate(String incomingMessage) { 
     final DataView fragment = (DataView) getFragmentManager().findFragmentByTag("DataView"); 
     if(fragment != null){ 
      fragment.onUpdate(incomingMessage); 
     } 
    } 
} 

3)あなたのセンサークラス更新:最初のフラグメントに直接行く前にsensorConnector.setListener(this);

私はMainActivityを通過することを選択した:あなたのActivity設定リスナーで

public class SensorConnector { 


    private SensorListener listener; 

    public void setSensorListener(SensorListener listener){ 
     this.listener = listener; 
    } 

    public void removeListener(){ 
     this.listener = null; 
    } 

    public void startThread(){ 

     new Thread(new Runnable() { 
      @Override public void run() { 

        byte[] buffer = new byte[1024]; 
        int bytes; 
        // Keep listening to the InputStream while connected 
        while (true) { 
         try { 
          // Read from the InputStream 
          bytes = mmInStream.read(buffer); 
          String incomingMessage = new String(buffer, 0, bytes); 

          // Code to send incomingMessage to Dataview 
          if(listener != null) { 
           listener.onUpdate(incomingMessage); 
          } 

         } catch (IOException e) { 
          Log.d(TAG, "disconnected " + e); 
          break; 
         } finally { 
          removeListener(); 
         } 
        } 
      } 
     }).start(); 
    } 
} 

4) FragmentActivityからのアップデートを観察したい場合もありますが、これはこれを行うために簡単に適応できます。あるいは、実際にはインターフェースを実装するものがあります。また、removeListener()SensorConnectorに限定されていませんActivityが破壊されたときにこれを削除し、参照を削除してください(あなたのSensorConnectorクラスの有効期間/ライフサイクルを知らない)。

2

リスナーパターンを試すことができます。あなたのフラグメントはリスナーインターフェースを実装し、コネクターは通知インターフェースを実装します。ノーティファイヤーにフラグメントを登録し、コネクターがデータを受け取ったら、リスナーに通知してください。覚えておくべき重要なことは、リスナーがノーティファイヤーによって呼び出されたときに、リスナーがフラグメントと同じスレッド上で更新作業を行う必要があることです。フラグメントスレッドのHandlerオブジェクトでこれを行うことができます。あなたが追加されますこの方法で通知インターフェイスは、次のようになりますあなたのコネクターで

interface ListenerInterface { 
    void update(Object data); 
} 

public class MyFragment extends Fragment implements ListenerInterface { 
    private Handler mHandler = new Handler(); 

    @Override 
    public void update(final Object data) { 
     //handle the notification here, use a Handler to do the work on 
     // the ui thread 
     mHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       // this runs on the fragment's ui thread 
      } 
     }); 
    } 
    // ... 
} 

...

interface NotifyInterface { 
    void registerListener(ListenerInterface listener) { 
} 

public class MyConnector implements NotifyInterface { 
    ListenerInterface mListener = null; 

    @Override 
    public void registerListener(ListenerInterface listener) { 
     mListener = listener; 
    } 

    private void doUpdate(Object data) { 
     if(mListener != null) { 
      mListener.update(data); 
     } 
    } 
    // then in your data generation code, call doUpdate as needed 
} 

:あなたはフラグメントは、以下のインタフェースを実装している場合があります例えば

UI内のUIログインとコネクタ内のデータロジックを保持する利点があります。

関連する問題