Java 如何以编程方式将图像添加到android应用程序
我想能够使用url的图像源。我发现下面的函数可以转换为位图。但是,我得到了一个“NetworkOnMainThreadException”Java 如何以编程方式将图像添加到android应用程序,java,android,image,url,Java,Android,Image,Url,我想能够使用url的图像源。我发现下面的函数可以转换为位图。但是,我得到了一个“NetworkOnMainThreadException” conn.connect(); ,是函数崩溃的地方 我还发现,由于这个异常,我应该使用AsyncTask类扩展。所以我在下面代码的第二部分中使用了它。我还是以同样的例外告终。我不完全理解错误的意思,只是我试图在同一时间在同一地点做太多的事情 有没有更简单的方法将url转换为我可以使用的图像?如何修复现有的功能 public static Bitmap g
conn.connect();
,是函数崩溃的地方
我还发现,由于这个异常,我应该使用AsyncTask类扩展。所以我在下面代码的第二部分中使用了它。我还是以同样的例外告终。我不完全理解错误的意思,只是我试图在同一时间在同一地点做太多的事情
有没有更简单的方法将url转换为我可以使用的图像?如何修复现有的功能
public static Bitmap getImageBitmap(String url) {
Log.i("bitmap","here?");
Bitmap bm = null;
Log.i("bitmap","here?");
try {
Log.i("bitmap","here?");
URL aURL = new URL(url);
Log.i("bitmap","here?");
URLConnection conn = aURL.openConnection();
Log.i("bitmap","last ?");
conn.connect();
Log.i("bitmap","here?");
InputStream is = conn.getInputStream();
Log.i("bitmap","here?");
BufferedInputStream bis = new BufferedInputStream(is);
Log.i("bitmap","here?");
bm = BitmapFactory.decodeStream(bis);
bis.close();
Log.i("bitmap","here?");
is.close();
Log.i("bitmap","here?");
} catch (IOException e) {
Log.e("img", "Error getting bitmap", e);
}
return bm;
}
使用异步任务:
class taskRunner extends AsyncTask<String, URL, Bitmap>{
public static Bitmap getImageBitmap(String url) {
Log.i("bitmap","here?");
Bitmap bm = null;
Log.i("bitmap","here?");
try {
Log.i("bitmap","here?");
URL aURL = new URL(url);
Log.i("bitmap","here?");
URLConnection conn = aURL.openConnection();
Log.i("bitmap","last ?");
conn.connect();
Log.i("bitmap","here?");
InputStream is = conn.getInputStream();
Log.i("bitmap","here?");
BufferedInputStream bis = new BufferedInputStream(is);
Log.i("bitmap","here?");
bm = BitmapFactory.decodeStream(bis);
bis.close();
Log.i("bitmap","here?");
is.close();
Log.i("bitmap","here?");
} catch (IOException e) {
Log.e("img", "Error getting bitmap", e);
}
return bm;
}
class taskRunner扩展了异步任务{
公共静态位图getImageBitmap(字符串url){
Log.i(“位图”,“此处?”);
位图bm=null;
Log.i(“位图”,“此处?”);
试一试{
Log.i(“位图”,“此处?”);
URL aURL=新URL(URL);
Log.i(“位图”,“此处?”);
URLConnection conn=aURL.openConnection();
Log.i(“位图”、“最后一个?”);
连接();
Log.i(“位图”,“此处?”);
InputStream is=conn.getInputStream();
Log.i(“位图”,“此处?”);
BufferedInputStream bis=新的BufferedInputStream(is);
Log.i(“位图”,“此处?”);
bm=BitmapFactory.decodeStream(bis);
二、关闭();
Log.i(“位图”,“此处?”);
is.close();
Log.i(“位图”,“此处?”);
}捕获(IOE异常){
Log.e(“img”,“获取位图时出错”,e);
}
返回bm;
}
非常感谢您抽出时间阅读此文章。首先,不要忘记清单中的互联网许可
<uses-permission android:name="android.permission.INTERNET"/>
应该是这样的,希望有帮助
编辑:
AsyncTask-这是异步结构
在本例中,参数是ImageView,您还希望传递url的字符串。
结果将是位图,并将在OnPostExecute方法上设置
为了理解,我写下了上面的例子。你可以在下一个链接中查看:
如果您还需要其他信息,请告诉我此问题的可能副本不是副本-海报知道该问题,但即使在参考该答案后仍无法解决该问题。但该问题当前的问题是没有堆栈跟踪来显示异常当前发生的位置-找到它将是解决此问题的关键修复它。该函数不返回位图。它的返回类型为。当我尝试将其分配给位图变量时,我被告知存在不匹配。当我按照上面的指示执行该函数时,它不会崩溃,但如何将位图获取到我的变量中并将其设置为imageView?android.os.AsyncTask这是来自android doc的,因此您可以e错了,它返回位图,然后你在方法onPostExecute上得到它。你需要理解AsyncTask的含义。我会给出我的答案。我对AsyncTask做了一些研究,我有更好的理解,但我不知道如何将位图设置为我的图像。我可以引用我在AsyncTask中在循环中创建的图像吗?我可以返回吗从AsyncTask中删除我的位图,然后将其设置为我的图像?如果该信息有帮助,我将根据服务器上的xml文件创建具有不同数量图像的行。您可以向AsyncTask传递所需的处理程序和全局列表。选项很少。请查看此线程的答案:或此线程:
class BitmapTaks extends AsyncTask<ImageView, Void, Bitmap> {
protected Bitmap doInBackground(ImageView... imageview) {
Log.i("bitmap","here?");
Bitmap bm = null;
Log.i("bitmap","here?");
try {
Log.i("bitmap","here?");
URL aURL = new URL(urls[0]);
Log.i("bitmap","here?");
URLConnection conn = aURL.openConnection();
Log.i("bitmap","last ?");
conn.connect();
Log.i("bitmap","here?");
InputStream is = conn.getInputStream();
Log.i("bitmap","here?");
BufferedInputStream bis = new BufferedInputStream(is);
Log.i("bitmap","here?");
bm = BitmapFactory.decodeStream(bis);
bis.close();
Log.i("bitmap","here?");
is.close();
Log.i("bitmap","here?");
} catch (IOException e) {
Log.e("img", "Error getting bitmap", e);
}
return bm;
}
protected void onPostExecute(Bitmap b) {
//do something after execute
}
}
new BitmapTaks().execute(url);