使用AsyncTask的加载位图图像 [英] Use AsyncTask to Load Bitmap Images

查看:106
本文介绍了使用AsyncTask的加载位图图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想有人通过我的应用程序工作负载的背景图像。我写的逻辑是这样的:

 公共类ImageLoader的扩展AsyncTask的<上下文,太虚,位图> {

    私人字符串URL;
    私人诠释类型;

    ImageLoader的(字符串的URL,整型)
    {
        URL =网址;
        type =类型;
    }

    @覆盖
    受保护的位图doInBackground(上下文...为arg0){

        AssetManager assetMgr =为arg0 [0] .getAssets();
        点阵位图= NULL;
        尝试 {
            位= BitmapFactory.de codeStream(assetMgr.open(URL));
        }赶上(IOException异常E){
            e.printStackTrace();
        }
        返回的位图;
    }

    @覆盖
    保护无效onPostExecute(位图的结果){
          super.onPostExecute(结果);

          如果(类型== 1)
              INST1 =结果;
          否则,如果(类型== 2)
              INST2 =结果;
          否则,如果(类型== 3)
              Inst3 =结果;
    }
}
 

然而,当我尝试启动一个新的线程是这样的:

 任务=新ImageLoader的(Instructions_2.png,3);
task.execute(gameContext);
 

但在程序中出现错误活套。prepare必须调用,其次是逻辑looper.quit()

不过,我可能会打断程序的时候我加活套。prepare(),而且没有looper.quit()来调用。

我是正确创建的任务?

  

编辑:

这是从什么时候我尝试运行错误日志:

 任务=新ImageLoader的(gameContext,Instructions_3.png,3);
 

我有我把图像加载器的声明之外的开关case语句。基本上我的code是:

  ImageLoader的任务;
开关(富)
{
    情况下0:
       ...
       任务=新ImageLoader的(gameContextInstructions_0.png,3);
       task.execute();
       打破;
    情况1:
       ...
       任务=新ImageLoader的(gameContextInstructions_1.png,3));
       task.execute();
       打破;
    ...
}
 

和错误日志(错误发生,每次我打了任务=新ImageLoader的(...);

  07-20 14:23:34.276:E / AndroidRuntime(16741):致命异常:螺纹10
07-20 14:23:34.276:E / AndroidRuntime(16741):java.lang.ExceptionInInitializerError
07-20 14:23:34.276:E / AndroidRuntime(16741):在com.petronicarts.stormthecastle.MainGamePanel.update(MainGamePanel.java:2578)
07-20 14:23:34.276:E / AndroidRuntime(16741):在com.petronicarts.stormthecastle.MainThread.run(MainThread.java:63)
07-20 14:23:34.276:E / AndroidRuntime(16741):java.lang.RuntimeException的:所致。内螺纹已经不叫尺蠖prepare无法创建处理器()
。07-20 14:23:34.276:E / AndroidRuntime(16741):在android.os.Handler< INIT>(Handler.java:121)
。07-20 14:23:34.276:E / AndroidRuntime(16741):在android.os.AsyncTask $ InternalHandler< INIT>(AsyncTask.java:421)
。07-20 14:23:34.276:E / AndroidRuntime(16741):在android.os.AsyncTask $ InternalHandler< INIT>(AsyncTask.java:421)
07-20 14:23:34.276:E / AndroidRuntime(16741):在android.os.AsyncTask< clinit>(AsyncTask.java:152)
07-20 14:23:34.276:E / AndroidRuntime(16741):... 2更多
 

解决方案

现在的问题是,你正在试图访问,并从非UI线程的UI元素进行操作。如果你改变你的的AsyncTask 如下,我相信你会好起来:

 公共类ImageLoader的扩展AsyncTask的<虚空,虚空,位图> {

私人字符串URL;
私人诠释类型;
私人上下文的背景下;
私人的InputStream的;

ImageLoader的(上下文的背景下,字符串的URL,整型)
{
    URL =网址;
    type =类型;
    ImageLoader.this.context =背景;
}

@覆盖
在preExecute保护无效()
{
   AssetManager assetMgr = context.getAssets();

   尝试 {

       在= assetMgr.open(URL);
   }赶上(IOException异常E){

       e.printStackTrace();
   }

}

@覆盖
受保护的位图doInBackground(虚空......为arg0){

    点阵位图= NULL;
    尝试 {
        位= BitmapFactory.de codeStream(中);
        附寄();
    }赶上(IOException异常E){
        e.printStackTrace();
    }
    返回的位图;
}

@覆盖
保护无效onPostExecute(位图的结果){

      如果(类型== 1)
          INST1 =结果;
      否则,如果(类型== 2)
          INST2 =结果;
      否则,如果(类型== 3)
          Inst3 =结果;
}
}
 

也改变你的 AyncTask 的调用是这样的:

 任务=新ImageLoader的(gameContext,Instructions_2.png,3);
task.execute();
 

I am trying to load an image in the background as someone works through my app. The logic I wrote is this:

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

However when I try to start a new thread like this:

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

But within the program I get the error Looper.prepare must be called, followed by the logic looper.quit()

However I seem to break the program when I add Looper.prepare(), and there is no looper.quit() to call.

Am I creating the task correctly?

EDIT:

This is the error log from when I try to run:

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

I have a switch case statement that I put the image loader declaration outside of. Essentially my code is:

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

And the error log (error occurs every time I hit the task = new ImageLoader(...); line

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

解决方案

The problem is that you are trying to access and operate on UI elements from a non UI thread. If you change your AsyncTask as follows, i believe you will be ok:

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

private String URL;
private int type;
private Context context;
private InputStream in;

ImageLoader(Context context, String Url, int Type)
{
    URL = Url;
    type = Type;
    ImageLoader.this.context = context;
}

@Override
protected void onPreExecute()
{
   AssetManager assetMgr = context.getAssets();

   try {

       in = assetMgr.open(URL);
   } catch (IOException e) {

       e.printStackTrace();
   }

}

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

    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeStream(in);
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bitmap;
}

@Override
protected void onPostExecute( Bitmap result )  {

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

Also change the call of your AyncTask to something like this:

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

这篇关于使用AsyncTask的加载位图图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆