当有人通过我的应用程序工作时,我正在尝试在后台加载图像。我写的逻辑是这样的:
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;
}
}
但是,当我尝试启动这样的新线程时:
task = new ImageLoader("Instructions_2.png", 3);
task.execute(gameContext);
但是在程序中我得到错误Looper.prepare必须被调用,随后是逻辑looper.quit()
但是,当我添加Looper.prepare()时,似乎中断了程序,并且没有要调用的looper.quit()。
我是否正确创建任务?
编辑:
这是我尝试运行时的错误日志:
task = new ImageLoader(gameContext, "Instructions_3.png", 3);
我有一个switch case语句,将图像加载器声明放在外面。本质上,我的代码是:
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;
...
}
和错误日志(每次上task = new ImageLoader(...);
线时都会发生错误
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
问题是您试图从非UI线程访问UI元素并对其进行操作。如果您更改AsyncTask
以下内容,我相信您会没事的:
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;
}
}
还要将您的呼叫更改为AyncTask
以下形式:
task = new ImageLoader(gameContext, "Instructions_2.png", 3);
task.execute();
我想通过传递一个网址来加载多个图像。与本教程不同http://www.learn2crack.com/2014/06/android-load-image-from-internet.html其中只有一个图像被下载并使用img.setImageBitmap(图像)查看;我的问题是如何将url发送到一个方法以加载该url的图像,该方法返回一个图像,然后我在图像视图中显示它。
问题内容: 如何使用Glide库将位图加载到ImageView中?我想使用文本创建自定义图像,然后使用Glide将其加载到imageview中。 这是我用文本创建自定义位图的方法 But when i try to load this bitmap using glide i’m getting error 问题答案: @rookiedev是正确的, Glide中没有load(Bitmap)它,这
如何使用Glide库将位图加载到ImageView中?我想用文本创建一个自定义图像,并使用Glide将其加载到imageview中。 这是我用文本创建自定义位图的方法 但是当我尝试使用glide加载这个位图时,我得到了一个错误
问题内容: 我在下面编写的功能是否足以在当今大多数(如果不是全部)浏览器中预加载图像? 我有一个图像URL数组,可以循环访问这些URL,并为每个URL 调用该函数。 问题答案: 是。这应该适用于所有主要的浏览器。
当我启动应用程序时,我没有看到任何错误,但是是一个空数组。组件本身位于。我试着直接加载图像: 但无论我指定的路径是什么,如果出现错误,它就不能正常工作了。但是,我需要从文件夹加载所有图像,而不是静态加载,因为我事先不知道图像的名称。如有任何建议,将不胜感激。
使用Glide将URL下载到非常容易: 我想知道我是否也可以下载到中?我想下载到原始位图中,然后我可以使用其他工具进行操作。我已经浏览了代码,但不知道如何操作。