Android 应用太慢。加速的方法?
Android app too slow. Ways to accelerate?
我刚刚用 Android Studio 编写了我的第一个 Android 应用程序。这是一个词汇训练器,它在启动时读取我的资产文件夹中的一个文本文件,其中包含所有单词(直到现在,我只有约 1000 个),如下所示:english$japanese$category。所以,我认为这应该没什么大不了的,即使我有一台旧的三星 S2。但是启动需要 10 秒,有时会崩溃。
这里是关键代码:
static String word;
static String[] listOfWords;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
readWords();
generateRandomWord();
}
public void readWords() {
try {
InputStream is = getAssets().open("words.txt");
String ww = "";
int data = is.read();
while(data != -1){
ww += (char) data;
data = is.read();
}
listOfWords = ww.split("\n");
} catch (IOException e) {
e.printStackTrace();
}
}
public void generateRandomWord() {
TextView textView = new TextView(this);
textView.setTextSize(40);
textView = (TextView) findViewById(R.id.text_id);
Random random = new Random();
int randomKey = random.nextInt(listOfWords.length-1);
String line = listOfWords[randomKey];
String[] parts = line.split("/");
Log.d("Tango-renshuu", "line: "+line+" "+parts.length+" "+parts[1]);
textView.setText(parts[1]);
word = parts[2];
}
当我尝试从另一个返回 Activity 时,同样的事情发生了,即使我正在使用 Intent.FLAG_ACTIVITY_CLEAR_TOP
像这样:
public void back(View view) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
有什么想法吗?或者你认为这只是我的设备?
感谢
您正在读取 Main-Thread 上的资产,您需要启动一个任务来加载它,而 Activity 呈现资产加载是在后台进行的。
您的 readWords
方法效率相当低:您在每次循环迭代时创建一个新字符串,并且逐个字符地读取文件。考虑使用 BufferedReader
直接逐行读取字符串:
InputStream stream = getAssets().open("words.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
ArrayList<String> lines = new ArrayList<String>();
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
listOfWords = lines.toArray(new String[lines.size()]);
reader.close();
如果你的代码在这个优化后仍然太慢,那么你应该把这段代码移到AsyncTask
这样至少它不会冻结UI,你可以显示一个加载同时微调器。
我刚刚用 Android Studio 编写了我的第一个 Android 应用程序。这是一个词汇训练器,它在启动时读取我的资产文件夹中的一个文本文件,其中包含所有单词(直到现在,我只有约 1000 个),如下所示:english$japanese$category。所以,我认为这应该没什么大不了的,即使我有一台旧的三星 S2。但是启动需要 10 秒,有时会崩溃。
这里是关键代码:
static String word;
static String[] listOfWords;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
readWords();
generateRandomWord();
}
public void readWords() {
try {
InputStream is = getAssets().open("words.txt");
String ww = "";
int data = is.read();
while(data != -1){
ww += (char) data;
data = is.read();
}
listOfWords = ww.split("\n");
} catch (IOException e) {
e.printStackTrace();
}
}
public void generateRandomWord() {
TextView textView = new TextView(this);
textView.setTextSize(40);
textView = (TextView) findViewById(R.id.text_id);
Random random = new Random();
int randomKey = random.nextInt(listOfWords.length-1);
String line = listOfWords[randomKey];
String[] parts = line.split("/");
Log.d("Tango-renshuu", "line: "+line+" "+parts.length+" "+parts[1]);
textView.setText(parts[1]);
word = parts[2];
}
当我尝试从另一个返回 Activity 时,同样的事情发生了,即使我正在使用 Intent.FLAG_ACTIVITY_CLEAR_TOP
像这样:
public void back(View view) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
有什么想法吗?或者你认为这只是我的设备?
感谢
您正在读取 Main-Thread 上的资产,您需要启动一个任务来加载它,而 Activity 呈现资产加载是在后台进行的。
您的 readWords
方法效率相当低:您在每次循环迭代时创建一个新字符串,并且逐个字符地读取文件。考虑使用 BufferedReader
直接逐行读取字符串:
InputStream stream = getAssets().open("words.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
ArrayList<String> lines = new ArrayList<String>();
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
listOfWords = lines.toArray(new String[lines.size()]);
reader.close();
如果你的代码在这个优化后仍然太慢,那么你应该把这段代码移到AsyncTask
这样至少它不会冻结UI,你可以显示一个加载同时微调器。