2014-09-23 33 views
2

我正在创建一个应用程序,它将接收来自多个设备的传感器数据,并且需要能够记录它。我创建了自己的自定义线程,它将根据我的UI线程的请求打开,记录和关闭文件。不过,它在录制时似乎会减慢我的用户界面。这可能是由于每条消息的开销?有没有更好的方法来完成这样的长期任务?Android:长时间运行的文件记录线程减慢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(); 
} 

}

+0

使用Traceview并找出问题的真正所在。 – CommonsWare 2014-09-23 23:46:42

回答

0

而是始终运行一个线程,我认为这是更好地为您使用的AsyncTask,并触发每条消息的任务。

保持长时间运行的线程可能在大多数时间空闲是没有意义的。

+0

所以我会打开主UI线程上的文件,然后为每个数据块分派一个asynctask来完成单个写操作? – Nate 2014-09-23 23:35:29

相关问题