子线程网络图片查看器和Handler消息处理器

来源:互联网 发布:淘宝王者代练可靠吗 编辑:程序博客网 时间:2024/04/29 22:59

1. Android not Responding(应用程序无响应) 阻塞了主线程 ANR异常

异常:

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() {/** * 接收消息 */@Overridepublic 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();}}};@Overrideprotected 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);}@Overridepublic void onClick(View v) {final String url = etUrl.getText().toString();new Thread(new Runnable() {@Overridepublic 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");// 设置请求方法为Getconn.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;}}


0 0