我的程序想做成这样,用户输入一个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线程中。咋办啊?
耗时操作在子线程,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
脑袋转不弯来啊,你就不能子线程调取网络接口,得到结果后切换到ui线程?谁说只能一个线程走到底,不能切换?