android - 在 NetworkOnMainThreadException 中将 url 转换为位图

标签 android url bitmap

<分区>

我想将某些 URL 中的图像动态添加到线性布局中。在运行这段代码时出现错误无法启动 Activity

ComponentInfo: android.os.NetworkOnMainThreadException at com.example.star.example.CompinfoActivity.getBitmapFromURL(CompinfoActivity.java:70) at com.example.star.example.CompinfoActivity.insertPhoto(CompinfoActivity.java:50) at com.example.star.example.CompinfoActivity.onCreate(CompinfoActivity.java:38)

请帮忙。这是我下面 Activity 的代码。

public class CompinfoActivity extends AppCompatActivity {

Dialog dialog;
LinearLayout myGallery;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_compinfo);

    dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.activity_compinfopopup);
    dialog.getWindow().getAttributes().width = AbsListView.LayoutParams.MATCH_PARENT;
    dialog.getWindow().getAttributes().height = AbsListView.LayoutParams.WRAP_CONTENT;
    dialog.show();

    myGallery = (LinearLayout) dialog.findViewById(R.id.mygallery);
    myGallery.addView(insertPhoto("http://example.com/a.png"));
    myGallery.addView(insertPhoto("http://example.com/b.png"));
    myGallery.addView(insertPhoto("http://example.com/c.png"));
    myGallery.addView(insertPhoto("http://example.com/d.png"));
    new MyTask().execute();



}

View insertPhoto(String path){
    Bitmap bm;
    bm =  getBitmapFromURL(path);
    LinearLayout layout = new LinearLayout(getApplicationContext());
    layout.setLayoutParams(new AbsListView.LayoutParams(250, 250));
    layout.setGravity(Gravity.CENTER);

    ImageView imageView = new ImageView(getApplicationContext());
    imageView.setLayoutParams(new AbsListView.LayoutParams(220, 220));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setImageBitmap(bm);

    layout.addView(imageView);
    return layout;
}


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

最佳答案

简单地做如下 -

public class MyAsync extends AsyncTask<Void, Void, Bitmap>{

    @Override
    protected Bitmap doInBackground(Void... params) {

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

    }
}

现在要从 url 访问位图,请执行以下操作 -

MyAsync obj = new MyAsync(){

        @Override
        protected void onPostExecute(Bitmap bmp) {
            super.onPostExecute(bmp);

            Bitmap bm = bmp;
            LinearLayout layout = new LinearLayout(getApplicationContext());
            layout.setLayoutParams(new AbsListView.LayoutParams(250, 250));
            layout.setGravity(Gravity.CENTER);

            ImageView imageView = new ImageView(getApplicationContext());
            imageView.setLayoutParams(new AbsListView.LayoutParams(220, 220));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setImageBitmap(bm);

            layout.addView(imageView);
        }
    };

然后最后执行 AsynTask -

obj.execute();

关于android - 在 NetworkOnMainThreadException 中将 url 转换为位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35285089/

相关文章:

android - 为什么我的 Android ActionBar 在显式更改时不更新

url - 在 Yii 中控制 url : controller/action/id to/id

java - 将卡片 View 转换为图像(位图)

Android - 将字符串转换为字节 []

android半透明位图背景为黑色

java - 如何使用 RxJava2 过滤列表并收集其索引到字符串结果?

java - 如何在 fragment 上显示操作栏图标?

android - 在应用计费 v3 NullPointerException

c# - 为什么 C# WebBrowser 中的 Url 值始终为 null?

url - 在搜索中显示特定国家/地区的网站