baidu_37617089 2022-06-20 10:41 采纳率: 70%
浏览 28
已结题

Android Studio主线程想连接网络问题。

我的程序想做成这样,用户输入一个url地址,然后我从这个地址把网络上的图片在imageview里展示出来。
现在的问题是:
1、我如果直接在主线程里连接网络,则报错
android.os.NetworkOnMainThreadException

代码:

ImageView pic1;
EditView my_input;
pic1 = (ImageView)view.findViewById(R.id.my_img);
my_input = (EditView)view.findViewById(R.id.my_input);
try{
            Bitmap bitmap1;
            URL myurl1;
            String picurl = my_input.getText();
            if(!picurl.isEmpty()){     
                 myurl1 = new URL(picurl);
                 HttpURLConnection conn = (HttpURLConnection)myurl1.openConnection();
                 conn.setConnectTimeout(6000);
                 conn.setDoInput(true);
                 conn.setUseCaches(false);
                 conn.connect();     //这里直接跳出去
                 InputStream inputStream = conn.getInputStream();
                 bitmap1 = BitmapFactory.decodeStream(inputStream);
                 inputStream.close();
                 pic1.setImageBitmap(bitmap1);
                 conn.disconnect();
             }
        }catch (Exception e)
        {
            e.printStackTrace();
        }

查了一下,说主线程不能进行网络连接,需要在子线程里做。

2、我在写一个子线程里做,能运行成功,但是e.printStackTrace()里
Only the original thread that created a view hierarchy can touch its views

new Thread()
{
            @Override
            public void run() {
                super.run();
//全部放到这里面

        }
}.start();

又说更新UI操作必须在UI线程中完成,而不能在非UI线程中。咋办啊?

  • 写回答

3条回答 默认 最新

  • 三杯五岳 2022-06-20 11:14
    关注

    耗时操作在子线程,UI操作在主线程(pic1.setImageBitmap(bitmap1);)。

    传统可采用 Thread + Handler的方式,也可以使用RXjava;

    图片加载建议使用glide等框架。https://blog.csdn.net/u013164293/article/details/51028576
    网络请求建议使用retrofit + okhttp.https://blog.csdn.net/u013164293/article/details/51340788

    评论 编辑记录
  • 立青_ 2022-06-20 11:17
    关注

    脑袋转不弯来啊,你就不能子线程调取网络接口,得到结果后切换到ui线程?谁说只能一个线程走到底,不能切换?

    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月28日
  • 已采纳回答 6月20日
  • 创建了问题 6月20日

悬赏问题

  • ¥15 matlab中此类型的变量不支持使用点进行索引
  • ¥15 咨询第六届工业互联网数据创新大赛原始数据
  • ¥15 Pycharm无法自动补全,识别第三方库函数接收的参数!
  • ¥15 STM32U575 pwm和DMA输出的波形少一段
  • ¥30 android百度地图SDK海量点显示标题
  • ¥15 windows导入environment.yml运行conda env create -f environment_win.yml命令报错
  • ¥15 这段代码可以正常运行,打包后无法执行,在执行for内容之前一直不断弹窗,请修改调整
  • ¥15 C语言判断有向图是否存在环路
  • ¥15 请问4.11到4.18以及4.27和4.29公式的具体推导过程是怎样的呢
  • ¥20 将resnet50中的卷积替换微ODConv动态卷积