Frage

Ich habe versucht, meine einzigen Thread App zu optimieren, die eine Reihe von Fliesen, dass Make-up eine große Bitmap lädt. Die App wurde immer sehr träge, wenn es um die neuen Fliesen in den Systemspeicher geladen werden würde. Im suchend jetzt versuchen Async Aufgaben für diesen Zweck zu verwenden. Die App erkennt die Fliese in der Spitze ist in einem Verfahren von OnDraw aufgerufen links, erzeugt einen String, der den Pfad der Bitmap im Assets-Ordner enthält, und prüft dann, ob die Bitmap null vor Zeichnung ist. Wenn es null ist, wird es in den Speicher laden. Meine Idee war es, die Bitmap in DoBackground und in PostExecute löst eine Ansicht Invalidier zu verarbeiten, um die async geladen Bitmap angezeigt werden soll. Ein paar Fragen:

1.) Kann ich meine ASync Aufgabe für jede Bitmap ausführen? . (Diese Aussage: neue myAsyncTaskManager () ausführen (bitmapPath), wenn nicht, was ist der beste Weg, um darüber zu gehen, da das einzige, was ASync tut nur Last-Bitmaps in dem Speicher ist

2.) Ist es möglich, die Priorität AsyncTask zu setzen, wenn die Bitmaps zu langsam laden?

3.) Gibt es einen besseren Weg, um dies zu realisieren? Im sicher es ist die Bitmap-Läden, und nicht die Leinwand, dass verlangsamt die Anwendung zu ziehen.

Mein temporärer Asynchron-Code:

private class myAsyncTaskManager extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... bitmapPath) {
      Log.e("sys","i ran using aTask");
        try {

            bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       return null;
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    mCampusMap.invalidate();
}
}
War es hilfreich?

Lösung

eine neue Antwort auf Ihre ganz neue Frage hinzu:)

  1. Abhängig von der Menge von Bitmaps. Wie viele haben Sie? Sie wollen nicht Dutzende von Threads erstellen. Immerhin haben Sie nur einen Kern auf Ihrer Hardware, so dass mehrere Threads, die werden Ihnen etwas nicht kaufen - der Kontextwechsel es nur ertrinken würde aus. Wenn Sie Tonnen von Bitmaps haben, können Sie eine Warteschlange von Bitmaps und Arbeit durch sie haben wollen. Dazu ein Thema und Handler wäre eigentlich besser sein.

  2. Es ist. Im Allgemeinen I set Arbeitsthreads einen Prioritätspegel niedriger als der Haupt-Thread.

Andere Tipps

Bitte warte, bis du rufst du bitmapLoaderThread.run ()? Es ist ziemlich schwer, herauszufinden, was los ist, weil diese Code-Schnipsel ohne Kontext (was für Thread etwas läuft auf welche Funktion?), Aber Sie rufen Sie nicht laufen () - das ist die Aufgabe des Betriebssystems! Um einen neuen Thread zu starten, Sie rufen start () - dies wird den neuen Thread erstellen und rufen seine run () Funktion. Wenn Sie direkt ausführen nennen, sind Sie noch in Ihrem eigenen Thread ruft!

Anders als das - wie macht man das Handshake zwischen den beiden Fäden? Wie funktioniert sagen, der Arbeiter-Thread dem Haupt-Thread, dass die Bitmap geladen wird? Sie können, dass ein Handler verwenden, oder Sie können eine AsyncTask anstelle des Gewinde insgesamt verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top