I don't know very much about programming, so I have produced a rather crappy implementation of the stroke input method.
In particular, I load all the stroke data into memory when the input method service is instantiated:
|
@Override |
|
public void onCreate() |
|
{ |
|
super.onCreate(); |
|
|
|
loadSequenceCharactersDataIntoMap(SEQUENCE_CHARACTERS_FILE_NAME, charactersFromStrokeDigitSequence); |
|
loadCharactersIntoCodePointSet(CHARACTERS_FILE_NAME_TRADITIONAL, codePointSetTraditional); |
|
loadCharactersIntoCodePointSet(CHARACTERS_FILE_NAME_SIMPLIFIED, codePointSetSimplified); |
|
loadRankingData(RANKING_FILE_NAME_TRADITIONAL, sortingRankFromCodePointTraditional, commonCodePointSetTraditional); |
|
loadRankingData(RANKING_FILE_NAME_SIMPLIFIED, sortingRankFromCodePointSimplified, commonCodePointSetSimplified); |
|
loadPhrasesIntoSet(PHRASES_FILE_NAME_TRADITIONAL, phraseSetTraditional); |
|
loadPhrasesIntoSet(PHRASES_FILE_NAME_SIMPLIFIED, phraseSetSimplified); |
|
|
|
updateCandidateOrderPreference(); |
|
} |
It works, but the downsides are:
- It takes a long time to load on lower-end devices (e.g. takes 1.2 seconds on my cheap phone with ~1.3 GB RAM)
- It requires a lot of memory
-
Most of the time is spent during loadSequenceCharactersDataIntoMap. Is there a better way of reading a TSV than what I currently have?
|
@SuppressWarnings("SameParameterValue") |
|
private void loadSequenceCharactersDataIntoMap( |
|
final String sequenceCharactersFileName, |
|
final Map<String, String> charactersFromStrokeDigitSequence |
|
) |
|
{ |
|
final long startMilliseconds = System.currentTimeMillis(); |
|
|
|
try |
|
{ |
|
final InputStream inputStream = getAssets().open(sequenceCharactersFileName); |
|
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); |
|
|
|
String line; |
|
while ((line = bufferedReader.readLine()) != null) |
|
{ |
|
if (!isCommentLine(line)) |
|
{ |
|
final String[] sunderedLineArray = Stringy.sunder(line, "\t"); |
|
final String strokeDigitSequence = sunderedLineArray[0]; |
|
final String characters = sunderedLineArray[1]; |
|
charactersFromStrokeDigitSequence.put(strokeDigitSequence, characters); |
|
} |
|
} |
|
} |
|
catch (IOException exception) |
|
{ |
|
exception.printStackTrace(); |
|
} |
|
|
|
final long endMilliseconds = System.currentTimeMillis(); |
|
sendLoadingTimeLog(sequenceCharactersFileName, startMilliseconds, endMilliseconds); |
|
} |
-
Alternatively, given that the stroke data is a constant map, is it possible to bake it into the class so that I don't need to load it every time? Or, can we do something completely different that isn't so memory intensive?
I don't know very much about programming, so I have produced a rather crappy implementation of the stroke input method.
In particular, I load all the stroke data into memory when the input method service is instantiated:
stroke-input-android/app/src/main/java/io/github/yawnoc/strokeinput/StrokeInputService.java
Lines 153 to 167 in c94a809
It works, but the downsides are:
Most of the time is spent during
loadSequenceCharactersDataIntoMap. Is there a better way of reading a TSV than what I currently have?stroke-input-android/app/src/main/java/io/github/yawnoc/strokeinput/StrokeInputService.java
Lines 220 to 252 in c23d584
Alternatively, given that the stroke data is a constant map, is it possible to bake it into the class so that I don't need to load it every time? Or, can we do something completely different that isn't so memory intensive?