有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何以编程方式将图像添加到安卓应用程序

我想能够使用url的图像源。我找到了以下转换为位图的函数。然而,我得到了一个“NetworkOnMainThreadException”用日志我发现了

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

非常感谢您抽出时间阅读本文


共 (1) 个答案

  1. # 1 楼答案

    首先,不要忘记清单中的互联网许可

    <uses-permission android:name="android.permission.INTERNET"/>
    

    第二个问题是你的实现是错误的

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

    应该是这样的,希望有帮助

    编辑:

    AsyncTask-这是异步结构

    在本例中,参数是ImageView,您还希望传递url的字符串。 结果将是位图,并将在OnPostExecute方法上设置

    为了理解,我写下了上面的例子。。您可以查看下一个链接:http://chrisharrington1.wordpress.com/2012/01/24/android-setting-a-downloaded-image-to-an-imageview/

    如果你还需要什么,请告诉我