网络编程--观察者模式
来源:互联网 发布:红帽子linux下载 编辑:程序博客网 时间:2024/06/06 00:54
网络请求无论在程序哪里发起,我们都是那些代码,只是参数不同罢了,所以我们可以封装一个HttpUtils类,在其中将重复的代码都写好,只需要我们传入的参数不同,我们就可以发起不同的网络请求了。
其实就是网络请求一般都是耗时操作,所以我们需要另开线程去访问网络,但是如果我们在访问网络的方法中开启新的线程,我们就不得而知这个新开的线程是否获取的数据,可能在数据还没返回之前,我们访问网络的方法就已经执行完毕了,如果是这样的话,可能就无法返回相应的数据了。(我也有点晕了,似懂非懂,但是就是感觉这样实现的方法很巧妙,请继续往下看)
为了避免上面的问题,我们可以定义一个接口,在其中写好两个方法,一个对应成功返回数据,一个对应访问出错。
同时两个方法的参数就是我们访问网络所得的数据
代码如下:
public class HttpUtils { public interface HttpBackData { public void onFinish(String data ); public void onError(String data); } public static void sendHttpRequest(final String urls, final HttpBackData httpBackData) { new Thread(new Runnable() { @Override public void run() { URL url; HttpURLConnection conn=null; try { url = new URL(urls); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); conn.setReadTimeout(5000); conn.setDoInput(true); conn.setDoOutput(true); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String data = ""; String temp = br.readLine(); while (temp != null) { data += temp; temp = br.readLine(); } br.close(); httpBackData.onFinish(data); } catch (Exception e) { e.printStackTrace(); httpBackData.onError("访问出错"); } finally { if (conn != null) { conn.disconnect(); } } } }).start(); }}
- 我们的参数中多了一个接口的实例,而且成功访问数据之后,我们就调用onfinish()方法
- 失败之后,我们就调用onError()方法
- 那么我们再来看主活动中的代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private Button button; private TextView textView; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); } private void init() { button= (Button) findViewById(R.id.button); button.setOnClickListener(this); textView= (TextView) findViewById(R.id.textView); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.button: String urls="http://www.baidu.com"; HttpUtils.sendHttpRequest(urls, new HttpUtils.HttpBackData() { @Override public void onFinish(String data) { Log.d("***",data); } @Override public void onError(String data) { Log.d("***",data); } }); break; } }}
可以看到,我们在点击按钮的实践中,发起了网络请求,然后必须实现接口的方法,这样就可以由方法的参数获取到网络请求的数据了。
需要注意一点,onFinish()和onError()方法最终还是在子线程中运行的,以此如果需要更新UI,我们还是需要拥戴异步消息处理机制
其实前面已经写过一片过于观察者模式的博客,不过那时候是在Java中用到的,不过大同小异,如果有兴趣还可以再看看看这篇博客 观察者模式
0 0
- 网络编程--观察者模式
- 编程基本知识--观察者模式
- Java观察者模式编程
- Android编程:观察者模式设计
- 【编程素质】设计模式-观察者模式
- C++编程模式1--观察者模式
- 观察者模式在Java编程中的应用
- php面向对象编程 – 观察者模式
- 基于键值的观察者模式编程
- 面向对象编程思想-观察者模式
- 面向对象编程思想-观察者模式
- ACE网络编程模式
- 编程模式 - 网络
- iOS:网络编程模式
- 如何看待编程模式 + 观察者模式含义解释
- C++ 编程实现 观察者模式--订阅模式-->初学者。
- PHP面向对象编程设计模式(四)观察者模式
- android网络监控下的观察者模式运用
- class of Python
- window下搭建React Native Android开发环境
- 自动刷新"徐小明"股市直播内容
- ubuntu 源码安装nodejs
- NOIP2013普及组 题解
- 网络编程--观察者模式
- 百度地图-根据起终点经纬度驾车导航
- 动态注册广播
- iOS --- UIcollectionView设置头尾
- 搭建Embedded Linux kernel环境--在QEMU上运行ARM linux系统
- 给 Android 开发者的 RxJava 详解
- 算法导论习题:10.2-7 in Go语言
- iOS ---UICollectionView简单使用
- UVa 11292 Dragon of Loowater