2017-02-08 6 views
-1

Ich habe gerade meine erste Android App mit Android Studio geschrieben. Es ist ein Vokabeltrainer und liest beim Start eine Textdatei in meinem Assets-Ordner ein, die alle Wörter enthält (bis jetzt habe ich nur ~ 1000): Englisch $ japanisch $ category. Also, ich dachte, das sollte nicht viel Arbeit sein, obwohl ich einen alten Samsung S2 habe. Aber es dauert 10 Sekunden zu starten und manchmal stürzt es ab.Android App zu langsam. Möglichkeiten zu beschleunigen?

Hier ist der kritische Code:

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]; 
} 

Das gleiche passiert, wenn ich versuche, von einem anderen zu dieser Aktivität zurück zu gehen, obwohl ich verwende Intent.FLAG_ACTIVITY_CLEAR_TOP So:

public void back(View view) { 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent); 
} 

Irgendeine Idee oder denkst du, es ist nur mein Gerät?

Thank

Antwort

0

Ihre Methode readWords ist ziemlich ineffizient: Sie erstellen eine neue Zeichenfolge bei jeder Schleifenwiederholung, und Sie lesen die Datei Zeichen für Zeichen. Erwägen Sie die Verwendung einer BufferedReader die Saiten Zeile für Zeile lesen direkt:

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(); 

Wenn Ihr Code nach dieser Optimierung noch zu langsam ist, dann sollten Sie diesen Code bewegen, um eine AsyncTask so zumindest ist es nicht gefriert die Benutzeroberfläche und Sie können in der Zwischenzeit einen Lade-Spinner anzeigen.

+0

Danke, es hat gut funktioniert. – user1734984

2

Du am Main-Thread, den Vermögenswert zu lesen, müssen Sie eine Aufgabe beginnen, es zu laden, während die Aktivität der Beladung geschieht im Hintergrund Asset gerendert wird.

Verwandte Themen