以前对于 客户端与服务器端总是不太熟悉,借着周末的事件好好的复习吧
骚年雄起吧~~~
还记步骤不?
还记得我上一篇文章 Hanlde消息处理机制的复习——网络图片下载么
上一篇文章我对于网络方面我很少提到,主要是用来复习handle消息机制的 。 安卓是不允许主线程有很多耗时操作的,而对于联网操作必须要放到 次线程的。而次线程请求的数据,而又不能放在次线程更新的,所以要放在主线程更新,所以handler消息机制的出现不是偶然。
具体步骤:
//1.开启子线程 执行一个http请求在后台执行在子线程执行
//2.子线程执行完毕后 通知ui界面更新
程序员前期要好好打基础,我们要好好听前辈的话,而到后期代码熟练以后,我要好好的偷懒~
我还记得 最火的开源项目里 第6个 正好是对于 异步+Http的封装,大家可以去github去下载, 如果单单是使用直接考入jar 就行了
我们先看一个对post 登录的封装吧 很方便 就5行代码
首先
1-2 拿到 登录帐号和密码
3.实例化 AsyncHttpclient (要用别人的东西还是要实例化的)
4.准备好一个url
5.将数据put 进去
6. 然后post 请求 (第一个参数是url,第二参数是 属性你put进来的数据 第三个是 handler jar自己封装的)
7.然后super 2个方法 也就是成功和失败 。
~~~~~~~~~~~~我是淫荡的分割线~~~~ ~~~ ~~~ 是时候自己写了
第一步 开启子线程 执行一个http请求在后台执行在子线程执行
PS:线程是用来获取数据的,你需要两个参数 一个URL 和handler 联网我们用httpclient 其中还会有一个流转String的一个工具类 然后用handler将数据发送出去
package com.xiaoxin.AsyHttp; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.os.Message; public class AsyncHttpClient { public void get(final String path, final MyHandler myhandler) { new Thread(new Runnable() { @Override public void run() { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(path); try { HttpResponse response = client.execute(get); InputStream is = response.getEntity().getContent(); String content = StreamTool.readInputStream(is); // 执行成功 Message message=new Message(); message.what=1; message.obj=content; myhandler.sendMessage(message); } catch (Exception e) { // 执行失败 e.printStackTrace(); Message message=new Message(); message.what=2; message.obj="请求失败"; myhandler.sendMessage(message); } } }); } }关于工具类 大家好好手残好哦 StreamTool
package com.xiaoxin.AsyHttp; import java.io.ByteArrayOutputStream; import java.io.InputStream; public class StreamTool { public static String readInputStream(InputStream is) { try { ByteArrayOutputStream out = new ByteArrayOutputStream(); int length = 0; byte[] buffer = new byte[1024]; if ((length = is.read(buffer)) != -1) { out.write(buffer, 0, length); } is.close(); byte[] result = out.toByteArray(); return new String(result); } catch (Exception e) { // TODO: handle exception } return "转换失败"; } }
第二步 自定义MyHandler
PS:自定义嘛 先继承Handler 先写两个方法 成功或者失败 因为在 AsyncHttpClient 传来了 内容 所以需要加入一个参数 String content 如果这个类不熟悉的话
同学们需要去复习下 消息机制了
package com.xiaoxin.AsyHttp; import android.os.Handler; import android.os.Message; public class MyHandler extends Handler { public void OnFailure(String content) { } public void OnSuccess(String content) { } @Override public void handleMessage(Message msg) { String content=(String) msg.obj; super.handleMessage(msg); switch (msg.what) { case 1: OnSuccess(content); break; case 2: OnFailure(content); break; default: break; } } }
你会发现 我们现在所写的格式 和 开源框架是那么的像
package com.xiaoxin.AsyHttp; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void btn(View view){ //1.开启子线程 执行一个http请求在后台执行在子线程执行 String path=""; AsyncHttpClient asyncHttpClient=new AsyncHttpClient(); asyncHttpClient.get(path, new MyHandler(){ @Override public void OnFailure(String content) { Toast.makeText(MainActivity.this, content, 1).show(); super.OnFailure(content); } @Override public void OnSuccess(String content) { Toast.makeText(MainActivity.this, content, 1).show(); super.OnSuccess(content); } }); //2.子线程执行完毕后 通知ui界面更新 } }
End-------------
下一篇内容是 用开源框架 上传文件, 其实嘛 很多程序员也不是都去了解 开源框架的,工作中使用开源框架是让你效率提高嘛