如何保持文件打开并在后台线程中向其追加数据?

时间:2016-02-17 04:43:00

标签: java android multithreading

我的数据成功来自我通过广播接收器发送到服务的传感器。我现在想把它传递给一个线程,将它附加到一个文件中。

我遵循this回答中提供的大纲。

并且已经找到了如何附加到文件here

我能解决的问题是如何在文件中保持文件打开,我不想每次收到消息时都要关闭它并重新打开文件“'消息循环。我的代码大致遵循我发现的here(大约在网页的1/3处)

具体问题如下:

  1. 我应该在哪里打开文件并存储对它的引用,每次新数据到达时都可以使用它?
  2. 在我发布的最后一个链接中,示例显示了" Long running Task"方法,在我的情况下saveDataToFile(String data)写在线程类之外,但是由消息处理程序looper调用,这是否意味着它在线程内部运行,即使该方法是在线程外写的?
  3. 此处代码(请注意,我并未复制所有与服务绑定相关的代码:

    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();
        }
    }
    

1 个答案:

答案 0 :(得分:1)

只需将打开的文件输出流保存在服务或线程的成员变量中。