-1

我刚刚用 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];
}

当我尝试从另一个活动返回该活动时,也会发生同样的事情,即使我使用的是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);
} 

任何想法或者你认为它只是我的设备?

谢谢

4

2 回答 2

2

您正在主线程上读取资产,您需要启动一个任务来加载它,而 Activity 被渲染,资产加载发生在后台。

于 2017-02-08T17:56:11.590 回答
0

您的readWords方法效率相当低:您在每次循环迭代时都创建一个新字符串,并且您正在逐个字符地读取文件。考虑使用 aBufferedReader直接逐行读取字符串:

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,同时你可以显示一个加载微调器。

于 2017-02-08T18:06:15.193 回答