网络图片浏览器

来源:互联网 发布:网络限速设置多少合适 编辑:程序博客网 时间:2024/05/22 17:11

ANR: application not response

产生原因:主线程里面的操作的响应时间不能太久,不然就会报此错误,所以,更新UI的程序必须放在子线程中,在2.3版本没有这个体验,后续版本有这样的规定,不然会报NetWorkOnMainThreadException,如果报UnknowHostException则没有加user-permission,INTERNET。


Handler是为了解决android的多线程问题--Android平台下不允许新启动的线程访问该Activity里面的组件,只可以主线程修改UI(线程的同步与互斥),这样会导致新启动的线程无法动态改变界面组件中的属性值,这就需要Handler的消息传递机制来解决了。

1.子线程利用Handler发送一条消息,消息被放到主线程的消息队列里面。

2.主线程里面有一个looper消息的消息轮询器。

3.如果轮询器发现了新的消息,调用handleMessage()的方法。

public class MainActivity extends Activity {private EditText et_path;private ImageView iv;private static final int CHANGE_UI = 0x110;protected static final int ERROR = 0;private Handler myHandler; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_path = (EditText)findViewById(R.id.ep_path);iv = (ImageView)findViewById(R.id.iv);myHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if(msg.what == CHANGE_UI){Bitmap bm = (Bitmap)msg.obj;iv.setImageBitmap(bm);}else if(msg.what == ERROR){Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG).show();}}}; }public void click(View view){//获取图片路径final String path = et_path.getText().toString().trim();if(TextUtils.isEmpty(path)){Toast.makeText(this, "图片路径不能为空", Toast.LENGTH_LONG).show();}else {//耗时的操作放在子线程中new Thread(){public void run(){//链接服务器get请求获取图片try {URL url = new URL(path);//根据Url发送http请求HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设置请求的方式conn.setRequestMethod("GET");conn.setConnectTimeout(5000);conn.setRequestProperty("user-agent", "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)");//得到服务器返回的响应码int code = conn.getResponseCode();if(code == 200){InputStream is = conn.getInputStream();Bitmap bitmap = BitmapFactory.decodeStream(is);Message msg = new Message();msg.what = CHANGE_UI;msg.obj = bitmap;myHandler.sendMessage(msg);//iv.setImageBitmap(bitmap);}else {Toast.makeText(MainActivity.this, "显示图片失败", Toast.LENGTH_LONG).show();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();//Toast同样是改变UI的操作,所以要放到主线程中Message msg = new Message();msg.what = ERROR;myHandler.sendMessage(msg);//Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG).show();}}}.start();}}}


原创粉丝点击