私は奇妙な問題があります。私はすでに を理解しようと多くの時間を失って、これを解決するが、何も動作しません。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方法 では、私はこれを試してみました。トーストはまだ実行中の であり、データはまだファイルに保存されています。
誰かがこれを引き起こしている可能性のあるアイデアがあれば、本当に感謝します。
あなたはプロガードを使用していますか? – Zoe
いいえプロガードはありません。 – Luiz
彼らは呼ばれていますか? – Zoe