Android:长时间运行的文件记录线程会降低UI的速度

时间:2014-09-23 23:24:12

标签: java android multithreading

我正在创建一个应用程序,它将从多个设备接收传感器数据,并且需要能够记录它。我创建了自己的自定义线程,它将根据我的UI线程的请求打开,记录和关闭文件。但是,录制时似乎会减慢我的UI速度。这可能是由于每封邮件的开销吗?是否有更好的方法来完成这样的长期任务?

public class FileThread extends Thread {

public static final int MSG_OPEN_FILE = 1000,
                        MSG_WRITE_FILE = 2000,
                        MSG_CLOSE_FILE = 3000;

public Handler handler;
private OutputStream fileStream;

@Override
public void run() {
    Looper.prepare();

    handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
                case MSG_OPEN_FILE: {
                    final String fileName = (String)msg.obj;
                    final File aclSensorDirectory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), "ACLSensor");

                    if(!aclSensorDirectory.exists()) {
                        if(!aclSensorDirectory.mkdir()) {
                            Log.e("FileThread", "Couldn't make directory!");
                        }
                    }

                    final File file = new File(aclSensorDirectory, fileName);

                    try {
                        fileStream = new BufferedOutputStream(new FileOutputStream(file));
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }

                    break;
                }
                case MSG_WRITE_FILE: {
                    final String data = (String)msg.obj;
                    try {
                        fileStream.write(data.getBytes());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
                }
                case MSG_CLOSE_FILE: {
                    try {
                        fileStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
    };

    Looper.loop();
}

}

1 个答案:

答案 0 :(得分:0)

我认为最好使用AsyncTask并为每条消息触发任务,而不是一直运行的线程。

没有必要保留一个长时间运行的线程,大部分时间都可能处于空闲状态。