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

网络处理

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

 网络处理

后台与网络

Avatar for 招文桃

招文桃

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; }