我成功地从传感器发送了数据,并通过广播接收器将其发送到服务。我现在想将它传递给一个线程以将其附加到文件中。
我正在遵循 this 中给出的大纲回答。
并且已经找到了如何附加到文件 here .
我无法解决的是如何在线程中保持文件打开,我不想每次有消息进入线程的消息循环时都必须关闭它并重新打开它。我的代码大致遵循我发现的东西 here (大约在网页的 1/3 处)
具体问题如下:
- 我应该在哪里打开文件并存储对它的引用,以便每次新数据到达时都可以使用?
- 在我发布的最后一个链接中,示例显示了“长时间运行的任务”方法,在我的例子中,
saveDataToFile(String data)
是在线程类之外编写的,但由消息处理程序循环程序调用,这是否意味着它是在线程内部运行的,即使该方法是在线程外部编写的?
此处代码(注意我没有复制所有与服务绑定(bind)相关的代码:
public class SaveDataService extends Service {
private boolean isBound;
private final IBinder myBinder = new SaveDataServiceBinder();
private SaveDataThread mySaveDataThread;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("save_data")) {
String data = intent.getStringExtra("data");
if (mySaveDataThread.myHandler != null) {
Message msg = mySaveDataThread.myHandler.obtainMessage(0);
msg.obj = data;
mySaveDataThread.myHandler.sendMessage(msg);
}
}
}
};
private class SaveDataThread extends Thread {
public Handler myHandler;
@Override
public void run() {
Looper.prepare();
myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {
String data = (String) msg.obj;
saveDataToFile(data);
}
}
};
Looper.loop();
}
}
private void saveDataToFile(String data) {
//save data
}
@Override
public void onCreate() {
super.onCreate();
IntentFilter filter = new IntentFilter();
filter.addAction("save_data");
registerReceiver(receiver, filter);
mySaveDataThread = new SaveDataThread();
mySaveDataThread.start();
}
@Override
public void onDestroy() {
unregisterReceiver(receiver);
mySaveDataThread.myHandler.getLooper().quit();
}
}
最佳答案
只需将打开的文件输出流保存在Service或Thread的成员变量中即可。
关于java - 如何保持文件打开并在后台线程中向其追加数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35448099/