Upgrade to Pro — share decks privately, control downloads, hide ads and more …

网络处理

 网络处理

后台与网络

招文桃

April 16, 2017
Tweet

More Decks by 招文桃

Other Decks in Technology

Transcript

  1.  Android系统中,Activity、Service和BroadcastReceiver都是工作在主 线程中  但耗时的操作会的降低用户界面的响应速度,甚至导致用户界面失去响 应。为避免不良的用户体验,Android要求耗时的操作需要单独启动子 线程。  (1)主线程 

    主线程负责处理与UI相关的事件,主线程通常又被叫做UI线程。只有主线程才可以 更新UI,从而避免多个子线程都更新UI而引发混乱  (2)子线程  耗时的操作,如访问网络、读写文件都必须放在子线程,子线程一般都是后台线程。 子线程不能直接更新UI 后台线程
  2.  消息处理四个核心类:Message、MessageQueue 、Looper 和Handler。  Message类的主要功能是进行消息的封装  如果需要在Message类中携带数据,可使用其属性或方法:  public

    int arg1  public int arg2  public Object obj  public void setData (Bundle data)  public Bundle getData () 通过Handler与Message相结合的方式 Message message = new Message(); message.obj = msg; message.what = 1;
  3.  消息处理四个核心类:Message、MessageQueue 、Looper 和Handler。  Handler的使用  在子线程中使用Handler的sendMessage(Message msg)方法发送消息 

    在主线程中new Handler()对象,并重写handleMessage(Message msg)方法,根据 Message的what字段进行相应的处理 通过Handler与Message相结合的方式 handler.sendMessage(message); Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 1:textView.setText(msg.obj.toString(); break; } ) } };
  4.  AsyncTask<Params, Progress, Result>  继承AsyncTask是可以指定3个泛型参数  用途  Params:指定需要传入的参数

     Progress:后台和前台之间要传递的内容  Result:任务执行完毕后返回的结果 通过AsyncTask实现
  5.  几个重要的方法  execute(Params... params)  执行一个异步任务,需要开发人员在代码中调用此方法,触发异步任务的执行。  onPreExecute() 

    在execute(Params... params)被调用后立即执行,一般用于在执行后台任务前对UI做的 准备工作  doInBackground(Params... params)  在onPreExecute()完成后立即执行,工作在子线程,此方法将接收输入参数和返回计算 结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。  onProgressUpdate(Progress... values)  在调用publishProgress(Progress... values)时,此方法被执行,可以直接更新到UI组件。  onPostExecute(Result result)  当后台操作结束时,此方法将会被调用,计算结果将做为参数(Result result)传递到此 方法中,可以直接将结果显示到UI组件上。 通过AsyncTask实现
  6.  自定义子类,继承AsyncTask,实现doInBackground()方法 通过AsyncTask实现 class MyTask extends AsyncTask<String,String,Void>{ @Override protected Void

    doInBackground(String... params) { try { Socket socket = new Socket(“10.0.2.2”,8888); DataInputStream inputStream = new DataInputStream(socket.getInputStream()); DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); outputStream.writeUTF(params[0]); String msg = inputStream.readUTF(); publishProgress(msg); } catch (IOException e) { e.printStackTrace(); } return null; } ……
  7.  服务器端  public ServerSocket (int port)  public Socket

    accept ()  客户端  public Socket (String dstName, int dstPort)  注意:本机服务器地址应填10.0.2.2  android4.0后要求必须把和网络相关的操作放到子线程中  获得输入输出流  public InputStream getInputStream ()  public OutputStream getOutputStream () 支持使用Socket通信
  8.  创建URL对象  public URL (String spec)  调用通过URL的openConnection方法得到一个HttpURLConnection实例 

    public URLConnection openConnection ()  通过HttpURLConnection的setRequestMethod设置HTTP请求的方法  public void setRequestMethod (String method)  通过HttpURLConnection的getInputStream方法可以获得服务器返回的输入流  public InputStream getInputStream ()  处理输入流,读取结果  public InputStreamReader (InputStream in)  public BufferedReader (Reader in)  BufferedReader的方法:public String readLine () 支持使用HTTP协议通信
  9. 支持使用HTTP协议通信 @Override protected Void doInBackground(String... params) { try { URL

    url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=" + params[0] + "&userId="); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream inputStream = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(inputStream); BufferedReader br = new BufferedReader(isr); String tempResult = null; StringBuilder result = new StringBuilder(); while ((tempResult = br.readLine()) != null) { result.append(tempResult); } publishProgress(result.toString()); } catch (IOException e) { e.printStackTrace(); } return null; }  通过网站http://www.webxml.com.cn/zh_cn/index.aspx进行电话号码归属 地查询
  10.  通过XmlPullParserFactory的newInstance()方法获得其实例  public static XmlPullParserFactory newInstance ()  通过XmlPullParserFactory的newPullParser()方法得到XmlPullParser

    对象  public XmlPullParser newPullParser ()  通过XmlPullParser的setInput方法将服务器返回的XML数据设置进去  public abstract void setInput (Reader in)  public abstract void setInput (InputStream inputStream, String inputEncoding) Pull解析
  11.  通过XmlPullParser的getEventType方法得到当前的解析事件  public abstract int getEventType ()  返回START_DOCUMENT,END_DOCUMENT,START_TAG,

    END_TAG, TEXT等  public abstract String getName ():获得结点名称  public abstract String nextText ():获得结点具体内容  public abstract int next ():获得下一个eventType Pull解析
  12. Pull解析 private String parseXML(InputStream inputStream) { String result = "";

    try { XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser parser = factory.newPullParser(); parser.setInput(inputStream,"UTF-8"); int eventType = parser.getEventType(); while (eventType != parser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: if (parser.getName().equals("string")) { result = parser.nextText(); } break; } eventType = parser.next(); } } catch (Exception e) { e.printStackTrace(); } return result; }