Avoid disk writes on UI thread.

bug: 3207554
Change-Id: I285691f9e94d989823fcb5c21615ca50cecddff6
main
Ken Wakasa 2010-11-18 18:37:46 +09:00
parent 3b776b7892
commit 11eb13e04f
1 changed files with 61 additions and 41 deletions

View File

@ -21,6 +21,9 @@ import android.view.inputmethod.InputMethodManager;
import android.content.Context;
import android.inputmethodservice.InputMethodService;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import android.text.format.DateUtils;
import android.text.format.Time;
import android.util.Log;
@ -172,7 +175,7 @@ public class LatinIMEUtil {
}
}
public String getLastString() {
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mLength; ++i) {
char c = mCharBuf[normalize(mEnd - 1 - i)];
if (!((LatinIME)mContext).isWordSeparator(c)) {
@ -247,16 +250,22 @@ public class LatinIMEUtil {
private static final String FILENAME = "log.txt";
private static final UsabilityStudyLogUtils sInstance =
new UsabilityStudyLogUtils();
private final Handler mLoggingHandler;
private File mFile;
private File mDirectory;
private InputMethodService mIms;
private PrintWriter mWriter;
private Date mDate;
private SimpleDateFormat mDateFormat;
private final Date mDate;
private final SimpleDateFormat mDateFormat;
private UsabilityStudyLogUtils() {
mDate = new Date();
mDateFormat = new SimpleDateFormat("dd MMM HH:mm:ss.SSS");
HandlerThread handlerThread = new HandlerThread("UsabilityStudyLogUtils logging task",
Process.THREAD_PRIORITY_BACKGROUND);
handlerThread.start();
mLoggingHandler = new Handler(handlerThread.getLooper());
}
public static UsabilityStudyLogUtils getInstance() {
@ -266,7 +275,6 @@ public class LatinIMEUtil {
public void init(InputMethodService ims) {
mIms = ims;
mDirectory = ims.getFilesDir();
createLogFileIfNotExist();
}
private void createLogFileIfNotExist() {
@ -301,51 +309,63 @@ public class LatinIMEUtil {
LatinImeLogger.onPrintAllUsabilityStudtyLogs();
}
public void write(String log) {
createLogFileIfNotExist();
final long currentTime = System.currentTimeMillis();
mDate.setTime(currentTime);
public void write(final String log) {
mLoggingHandler.post(new Runnable() {
public void run() {
createLogFileIfNotExist();
final long currentTime = System.currentTimeMillis();
mDate.setTime(currentTime);
final String printString = String.format("%s\t%d\t%s\n", mDateFormat.format(mDate),
currentTime, log);
if (LatinImeLogger.sDBG) {
Log.d(TAG, "Write: " + log);
}
mWriter.print(printString);
mWriter.flush();
final String printString = String.format("%s\t%d\t%s\n",
mDateFormat.format(mDate), currentTime, log);
if (LatinImeLogger.sDBG) {
Log.d(TAG, "Write: " + log);
}
mWriter.print(printString);
}
});
}
public void printAll() {
StringBuffer sb = new StringBuffer();
BufferedReader br = getBufferedReader();
String line;
try {
while ((line = br.readLine()) != null) {
sb.append('\n');
sb.append(line);
mLoggingHandler.post(new Runnable() {
public void run() {
mWriter.flush();
StringBuilder sb = new StringBuilder();
BufferedReader br = getBufferedReader();
String line;
try {
while ((line = br.readLine()) != null) {
sb.append('\n');
sb.append(line);
}
} catch (IOException e) {
Log.e(TAG, "Can't read log file.");
} finally {
if (LatinImeLogger.sDBG) {
Log.d(TAG, "output all logs\n" + sb.toString());
}
mIms.getCurrentInputConnection().commitText(sb.toString(), 0);
try {
br.close();
} catch (IOException e) {
}
}
}
} catch (IOException e) {
Log.e(TAG, "Can't read log file.");
} finally {
if (LatinImeLogger.sDBG) {
Log.d(TAG, "output all logs\n" + sb.toString());
}
mIms.getCurrentInputConnection().commitText(sb.toString(), 0);
try {
br.close();
} catch (IOException e) {
}
}
});
}
public void clearAll() {
if (mFile != null && mFile.exists()) {
if (LatinImeLogger.sDBG) {
Log.d(TAG, "Delete log file.");
mLoggingHandler.post(new Runnable() {
public void run() {
if (mFile != null && mFile.exists()) {
if (LatinImeLogger.sDBG) {
Log.d(TAG, "Delete log file.");
}
mFile.delete();
mWriter.close();
}
}
mFile.delete();
mWriter.close();
}
});
}
private BufferedReader getBufferedReader() {
@ -365,7 +385,7 @@ public class LatinIMEUtil {
mFile.delete();
}
}
return new PrintWriter(new FileOutputStream(mFile));
return new PrintWriter(new FileOutputStream(mFile), true /* autoFlush */);
}
}
}