子线程网络图片查看器和Handler消息处理器
2015-04-18 16:13
417 查看
1. Android not Responding(应用程序无响应) 阻塞了主线程 ANR异常
异常:
CalledFromWrongThreadException: Only theoriginal thread that created a view hierarchy can touch its views.
只有原始的线程(主线程, ui线程)才能修改view对象.
在子线程中修改view的显示状态, 会报上面异常.
2.
3.代码
因为是内部类,所以子线程可以用到主线程创建的handle
异常:
CalledFromWrongThreadException: Only theoriginal thread that created a view hierarchy can touch its views.
只有原始的线程(主线程, ui线程)才能修改view对象.
在子线程中修改view的显示状态, 会报上面异常.
2.
3.代码
因为是内部类,所以子线程可以用到主线程创建的handle
public class MainActivity extends Activity implements OnClickListener { private static final String TAG = "MainActivity"; protected static final int ERROR = 1; private EditText etUrl; private ImageView ivIcon; private final int SUCCESS = 0; private Handler handler = new Handler() { /** * 接收消息 */ @Override public void handleMessage(Message msg) { super.handleMessage(msg); Log.i(TAG, "what = " + msg.what); if(msg.what == SUCCESS) { // 当前是访问网络, 去显示图片,可用于判断是哪个线程发的信息 ivIcon.setImageBitmap((Bitmap) msg.obj); // 设置imageView显示的图片 } else if(msg.what == ERROR) { Toast.makeText(MainActivity.this, "抓去失败", 0).show(); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivIcon = (ImageView) findViewById(R.id.iv_icon); etUrl = (EditText) findViewById(R.id.et_url); findViewById(R.id.btn_submit).setOnClickListener(this); } @Override public void onClick(View v) { final String url = etUrl.getText().toString(); new Thread(new Runnable() { @Override public void run() { Bitmap bitmap = getImageFromNet(url); // ivIcon.setImageBitmap(bitmap); // 设置imageView显示的图片 if(bitmap != null) { Message msg = new Message(); msg.what = SUCCESS; //what可用于判断是哪个线程发的信息 msg.obj = bitmap; handler.sendMessage(msg); } else { Message msg = new Message(); msg.what = ERROR; handler.sendMessage(msg); } }}).start(); } //-------------------------------------------------------子线程与主线程通信-------上---------------------------------- /** * 根据url链接取网络抓去图片返回 * @param url * @return url对应的图片 */ private Bitmap getImageFromNet(String url) { HttpURLConnection conn = null; try { URL mURL = new URL(url); // 创建一个url对象 // 得到http的连接对象 conn = (HttpURLConnection) mURL.openConnection(); conn.setRequestMethod("GET"); // 设置请求方法为Get conn.setConnectTimeout(10000); // 设置连接服务器的超时时间, 如果超过10秒钟, 没有连接成功, 会抛异常 conn.setReadTimeout(5000); // 设置读取数据时超时时间, 如果超过5秒, 抛异常 conn.connect(); // 开始链接 int responseCode = conn.getResponseCode(); // 得到服务器的响应码 if(responseCode == 200) { // 访问成功 InputStream is = conn.getInputStream(); // 获得服务器返回的流数据 Bitmap bitmap = BitmapFactory.decodeStream(is); // 根据 流数据 创建一个bitmap位图对象 return bitmap; } else { Log.i(TAG, "访问失败: responseCode = " + responseCode); } } catch (Exception e) { e.printStackTrace(); } finally { if(conn != null) { conn.disconnect(); // 断开连接 } } return null; } }
相关文章推荐
- 【黑马Android】(05)短信/查询和添加/内容观察者使用/子线程网络图片查看器和Handler消息处理器/html查看器/使用HttpURLConnection采用Post方式请求数据/开源项目
- 子线程网络图片查看器和Handler消息处理器
- Android -- 网络图片查看器,网络html查看器, 消息机制, 消息队列,线程间通讯
- Android -- 网络图片查看器,网络html查看器, 消息机制, 消息队列,线程间通讯
- 网络图片查看器(子线程与消息传递)
- android开发学习(四)——anr产生的原理&如何避免,android消息机制入门, 网络图片查看器
- Handler消息传输机制(实例)—— 获取网络图片
- android消息机制之网络图片查看器
- 适用于android 4.0以上版本的子线程网络图片查看器
- 安卓笔记之网络图片查看器小程序以及消息处理机制运用
- android 网络图片查看器,Handler的用法
- 网络图片查看器(多线程、Handler)
- 无废话Android之内容观察者ContentObserver、获取和保存系统的联系人信息、网络图片查看器、网络html查看器、使用异步框架Android-Async-Http(4)
- 图解 Android Handler 线程消息机制
- SmartImageView-网络图片查看器
- Looper,MessageQueue,Handler,异步消息线程
- 安卓:handler下载网络图片(附带有进度条和网络连接判断的APP)
- LIFO和FIFO——Handler 异步消息处理机制的妙用 创建强大的图片加载类
- android4.0以上网络访问为什么要开线程,已经Handler的使用
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类【转】