Verwenden Sie AsyncTask, um Bitmap-Bilder zu laden

Ich versuche, ein Bild in den Hintergrund zu laden, während jemand über meine App arbeitet. Die Logik, die ich geschrieben habe, ist folgende:

public class ImageLoader extends AsyncTask <Context, Void, Bitmap>{

    private String URL;
    private int type;

    ImageLoader(String Url, int Type)
    {
        URL = Url;
        type = Type;
    }

    @Override
    protected Bitmap doInBackground(Context... arg0) {

        AssetManager assetMgr = arg0[0].getAssets();
        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeStream(assetMgr.open(URL));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute( Bitmap result )  {
          super.onPostExecute(result);

          if (type == 1)
              Inst1 = result;
          else if (type == 2)
              Inst2 = result;
          else if (type == 3)
              Inst3 = result;
    }
}

Wenn ich jedoch versuche, einen neuen Thread wie diesen zu starten:

task = new ImageLoader("Instructions_2.png", 3);
task.execute(gameContext);

Aber innerhalb des Programms bekomme ich den Fehler, dass Looper.prepare aufgerufen werden muss, gefolgt von der Logik looper.quit ()

Ich scheine jedoch das Programm zu unterbrechen, wenn ich Looper.prepare () hinzufüge, und es ist kein looper.quit () zum Aufrufen vorhanden.

Erstelle ich die Aufgabe richtig?

BEARBEITEN:

Dies ist das Fehlerprotokoll, wenn ich versuche, Folgendes auszuführen:

task = new ImageLoader(gameContext, "Instructions_3.png", 3);

Ich habe eine switch case-Anweisung, außerhalb derer ich die Image Loader-Deklaration platziert habe. Im Wesentlichen ist mein Code:

ImageLoader task;
switch(foo)
{
    case 0:
       ...
       task = new ImageLoader(gameContext, "Instructions_0.png", 3);
       task.execute();
       break;
    case 1:
       ...
       task = new ImageLoader(gameContext, "Instructions_1.png", 3));
       task.execute();
       break;
    ...
}

Und das Fehlerprotokoll (Fehler tritt jedes Mal auf, wenn ich die Taste drücketask = new ImageLoader(...); Linie

07-20 14:23:34.276: E/AndroidRuntime(16741): FATAL EXCEPTION: Thread-10
07-20 14:23:34.276: E/AndroidRuntime(16741): java.lang.ExceptionInInitializerError
07-20 14:23:34.276: E/AndroidRuntime(16741):    at com.petronicarts.stormthecastle.MainGamePanel.update(MainGamePanel.java:2578)
07-20 14:23:34.276: E/AndroidRuntime(16741):    at com.petronicarts.stormthecastle.MainThread.run(MainThread.java:63)
07-20 14:23:34.276: E/AndroidRuntime(16741): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-20 14:23:34.276: E/AndroidRuntime(16741):    at android.os.Handler.<init>(Handler.java:121)
07-20 14:23:34.276: E/AndroidRuntime(16741):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
07-20 14:23:34.276: E/AndroidRuntime(16741):    at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421)
07-20 14:23:34.276: E/AndroidRuntime(16741):    at android.os.AsyncTask.<clinit>(AsyncTask.java:152)
07-20 14:23:34.276: E/AndroidRuntime(16741):    ... 2 more

Antworten auf die Frage(1)

Ihre Antwort auf die Frage