Android从URL加载到位图#2
基于以下回答,我无法从Android上的url加载位图: 我已将案例简化到绝对最小:Android从URL加载到位图#2,android,android-emulator,bitmap,Android,Android Emulator,Bitmap,基于以下回答,我无法从Android上的url加载位图: 我已将案例简化到绝对最小: public void loadBitmap(View view) { Bitmap b = getBitmapFromURL("http://upload.wikimedia.org/wikipedia/en/7/70/Example.png"); } public Bitmap getBitmapFromURL(String src) { try { URL url = n
public void loadBitmap(View view) {
Bitmap b = getBitmapFromURL("http://upload.wikimedia.org/wikipedia/en/7/70/Example.png");
}
public Bitmap getBitmapFromURL(String src) {
try {
URL url = new URL(src);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap myBitmap = BitmapFactory.decodeStream(input);
return myBitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
我已在清单中启用internet访问(我相信):
这是我第一天尝试制作Android应用程序,所以我可能犯了一个明显的错误。我正在使用emulator和Win7。这是因为您试图从ui线程访问internet(更多信息) 创建一个新线程(如果愿意,可以使用asyncTask,但任何其他线程创建方法都可以),以便访问internet,一旦位图准备好,如果希望显示它,请将其传递给ui线程 此外,有关位图处理的示例,请阅读以下内容:
这是因为您试图从ui线程访问internet(更多信息) 创建一个新线程(如果愿意,可以使用asyncTask,但任何其他线程创建方法都可以),以便访问internet,一旦位图准备好,如果希望显示它,请将其传递给ui线程 此外,有关位图处理的示例,请阅读以下内容:
从Android 3.0开始,同步操作不能再直接从UI线程运行。如果您试图在onCreate()方法中直接调用loadBitmap(View View)方法,则当应用程序在运行Android 3.0及更高版本的设备上运行时,它将崩溃。因为loadBitmap()方法是同步的——也就是说,在下载图像之前它不会返回控件——直接调用它将冻结活动的UI。这在Android 3.0及更高版本中是不允许的;所有同步代码必须使用AsyncTask类进行包装。使用AsyncTask可以在单独的线程中执行后台任务,然后在UI线程中返回结果。这样,您就可以执行后台操作,而无需处理复杂的线程问题。要异步调用loadBitamp()方法,需要将代码封装在AsyncTask类的子类中,如下所示:
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return getBitmapFromUrl(urls[0]);
}
protected void onPostExecute(Bitamp result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}
从Android 3.0开始,同步操作不能再直接从UI线程运行。如果您试图在onCreate()方法中直接调用loadBitmap(View View)方法,则当应用程序在运行Android 3.0及更高版本的设备上运行时,它将崩溃。因为loadBitmap()方法是同步的——也就是说,在下载图像之前它不会返回控件——直接调用它将冻结活动的UI。这在Android 3.0及更高版本中是不允许的;所有同步代码必须使用AsyncTask类进行包装。使用AsyncTask可以在单独的线程中执行后台任务,然后在UI线程中返回结果。这样,您就可以执行后台操作,而无需处理复杂的线程问题。要异步调用loadBitamp()方法,需要将代码封装在AsyncTask类的子类中,如下所示:
private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
protected Bitmap doInBackground(String... urls) {
return getBitmapFromUrl(urls[0]);
}
protected void onPostExecute(Bitamp result) {
ImageView img = (ImageView) findViewById(R.id.img);
img.setImageBitmap(result);
}
}
当图像大小为5毫克时,你的虚空会崩溃。位图正在堆叠RAM,因此采样20个图像*5=100 mb。当您重新打开“活动”时,会有另外100 mb的内存消耗,应用程序将崩溃。在代码中添加以下行
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inSampleSize = 2;
Bitmap myBitmap = BitmapFactory.decodeStream(input,rect,options);
当图像大小为5毫克时,你的虚空会崩溃。位图正在堆叠RAM,因此采样20个图像*5=100 mb。当您重新打开“活动”时,会有另外100 mb的内存消耗,应用程序将崩溃。在代码中添加以下行
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inSampleSize = 2;
Bitmap myBitmap = BitmapFactory.decodeStream(input,rect,options);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.RGB_565;
options.inSampleSize = 2;
Bitmap myBitmap = BitmapFactory.decodeStream(input,rect,options);