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

标签 java android multithreading

我成功地从传感器发送了数据,并通过广播接收器将其发送到服务。我现在想将它传递给一个线程以将其附加到文件中。

我正在遵循 this 中给出的大纲回答。

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

我无法解决的是如何在线程中保持文件打开,我不想每次有消息进入线程的消息循环时都必须关闭它并重新打开它。我的代码大致遵循我发现的东西 here (大约在网页的 1/3 处)

具体问题如下:

  1. 我应该在哪里打开文件并存储对它的引用,以便每次新数据到达时都可以使用?
  2. 在我发布的最后一个链接中,示例显示了“长时间运行的任务”方法,在我的例子中,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/

相关文章:

java - 在 onCreate 方法中传递 Activity 上下文

java - 如何按需暂停 Java 线程?

java - eclipse RCP : Stopping a thread/job that freezes

c# - EnterWriteLock之后,不保留锁定

java - Android 和 JAX-RS

java - 使 GridView 的顶行不可滚动

java - Servlet 中的 cookie 是什么时候创建的?

java - 地理围栏算法

java - Android/Java 及多个 "view states"

android - 约束布局的子边距