2016-07-16 30 views
0

私は奇妙な問題があります。私はすでに を理解しようと多くの時間を失って、これを解決するが、何も動作しません。logcatにログが出力されない

私は、一部のセンサーデータを受信するためにBluetooth接続 を介して別のデバイスと通信するアプリを持っています。その時点で、すべて正常に動作し、私は をデバイスに接続し、メッセージを受信して​​処理することができます。

昨日、アプリから何も変わらずにデバイスから受信したデータを の内部メモリに直接保存するために、ある種のログファイルを作成することにしました。デバイスからのデータを受信する

、私は、バックグラウンドスレッドを持っている:

public class CommunicationThread extends Thread { 
    private static final UUID UUID_DEVICE = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); 
    private static final String TAG = CommunicationThread.class.getSimpleName(); 
    private CommunicationListener mListener; 
    private boolean mRunning; 
    private BluetoothSocket mBluetoothSocket; 
    private InputStream mInputStream; 
    private OutputStream mOutputStream; 

    public interface CommunicationListener { 
     void onMessageReceived(String msg); 
    } 

    public CommunicationThread(
      @NonNull BluetoothDevice device, 
      @Nullable CommunicationListener listener) throws IOException { 
     BluetoothSocket socket = device.createRfcommSocketToServiceRecord(UUID_DEVICE); 
     socket.connect(); 
     this.mBluetoothSocket = socket; 
     this.mInputStream = socket.getInputStream(); 
     this.mOutputStream = socket.getOutputStream(); 
     this.mListener = listener; 
    } 

    @Override 
    public void run() { 
     mRunning = true; 
     byte[] bytes = new byte[1024]; 
     int length; 
     while (mRunning) { 
      try { 
       Log.d(TAG, "Waiting for message"); 
       // read the message (block until receive) 
       length = mInputStream.read(bytes); 
       String msg = new String(bytes, 0, length); 
       Log.d(TAG, "Message: " + msg); 
       // Message received, inform the listener 
       if (mListener != null) 
        mListener.onMessageReceived(msg); 
      } catch (Exception e) { 
       Log.e(TAG, "Error reading the message", e); 
      } 
     } 
    } 

    public void sendCommand(String msg) { 
     try { 
      mOutputStream.write((msg).getBytes()); 
     } catch (Exception e) { 
      Log.e(TAG, "Error to send message", e); 
     } 
    } 

    public void stopCommunication() { 
     mRunning = false; 
     mListener = null; 
     try { 
      if (mBluetoothSocket != null) { 
       mBluetoothSocket.close(); 
      } 
      if (mInputStream != null) { 
       mInputStream.close(); 
      } 
      if (mOutputStream != null) { 
       mOutputStream.close(); 
      } 

     } catch (IOException e) { 
      Log.e(TAG, "Error to stop communication", e); 
     } 
    } 
} 

このスレッドはかなり正常に動作し、メッセージを受信したとき、それは私のコントローラクラス 、リスナーに通知します。私は、メッセージが来たときに実行しようと最初にすることは、それを救うである:ここでは

public class Controller implements CommunicationThread.CommunicationListener 

    ... 

    @Override 
    public void onMessageReceived(final String msg) { 
     Log.d(TAG, "onMessageReceived(msg): " + msg); 
     mLogCreator.saveThis(msg); 
     .... 
    } 

} 

はLogCreatorクラスです:

public class LogCreator { 
    private static final String TAG = LogCreator.class.getSimpleName(); 
    public static final String LOG_FILE_NAME = "log.txt"; 
    private final Context mContext; 
    private volatile String mTempFullLog; 

    public LogCreator(Context context) { 
     mContext = context.getApplicationContext(); 
     File dir = new File(mContext.getFilesDir(), "log_folder"); 
     if (!dir.exists()) { 
      dir.mkdirs(); 
      File file = new File(dir, LOG_FILE_NAME); 
      writeString(file, ""); 
      Log.d(TAG, "empty file created"); 
     } 
    } 

    public void saveThis(final String data) { 
     mTempFullLog += "\n" + data; 
     Log.d(TAG, "New log: " + data); 
    } 

    public void start() { 
     File dir = new File(mContext.getFilesDir(), "log_folder"); 
     File file = new File(dir, LOG_FILE_NAME); 
     mTempFullLog = readString(file); 
     Log.d(TAG, "File: " + file); 
     Log.d(TAG, "Temp full log: " + mTempFullLog); 
    } 

    public void stop() { 
     File dir = new File(mContext.getFilesDir(), "log_folder"); 
     File file = new File(dir, LOG_FILE_NAME); 
     writeString(file, mTempFullLog); 
     Log.d(TAG, "log saved: " + mTempFullLog); 
    } 
} 

LogCreatorクラスがすでに初期化され、それが正常に動作している、 ので、後でファイルを読み込もうとすると、すべてがそこにあります。

実際の問題は次のとおりです。 この実行フローの間にLog.dの呼び出しが多くあり、これがすべてのプロセスを非常に理解しやすくなります。 はしかし、ログはのみ CommunicationThreadクラスで、このLog.dコールまでlogcatで印刷されています

Log.d(TAG, "Waiting for message); 

メッセージを受信した後、すべてのコードは正常に実行されますが、何のログが logcatに印刷されていませんなぜ私は本当に知りません。

印刷されませんログ:

CommunicationThread:

Log.d(TAG, "Message: " + msg); 

コントローラー:

Log.d(TAG, "onMessageReceived(msg): " + msg); 

LogCreator:

Log.d(TAG, "New log: " + data); 

私はすべてがworkiであることを知って、言ったようにログコード がlogcatの出力がなくても内部メモリに作成されているため、コードには問題ありません。それは私には 時間が実際にログでのみ問題であることを実現するのにかかる時間がかかりました 私のコード。テストの目的のために

、私はそれが正常に実行さLogCreator、 のsaveThis方法でこのコードを追加した場合:

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(mContext, data, Toast.LENGTH_SHORT).show(); 
    } 
}); 

これは私がすべてはスレッド問題になることができると思わせる、スタート および停止理由LogCreatorのメソッドはどちらもCommunicationThreadではなくメインスレッドから呼び出され、両方のメソッドにはログが出力されます。

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    @Override 
    public void run() { 
     mLogCreator.saveThis(msg); 
    } 
}); 

しかし、残念ながら、ログはlogcatで印刷されません。このため、コントローラクラスのonMessageReceived方法 では、私はこれを試してみました。トーストはまだ実行中の であり、データはまだファイルに保存されています。

誰かがこれを引き起こしている可能性のあるアイデアがあれば、本当に感謝します。

+0

あなたはプロガードを使用していますか? – Zoe

+0

いいえプロガードはありません。 – Luiz

+0

彼らは呼ばれていますか? – Zoe

答えて

0

私はついに自分で解決策を見つけました。次のような仕事が私にとってはっきりしない理由は、IMOはバグのように扱うべきです。

私はデバッグモードでアプリケーションをコンパイルし、デバイスから受け取った文字列の最後に "\ r"があることを発見します。

例:だから"15.50\r"

、いくつかの奇妙な理由で、私はこれを行うにしようとした場合:

Log.d(TAG, "New log: " + data); 

何も印刷をし、私たちはまったくの警告を受けません。

しかし、私が代わりにこれを行う場合:

Log.d(TAG, "New log: " + data.replace("\r", "")); 

をデータがある:"15.50\r"

すべてが動作し、logcatはメッセージを出力します。

関連する問題