Android从URL加载到位图#2

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

基于以下回答,我无法从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 = 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);