当前位置:   article > 正文

api 14 后,getResponseCode()==HTTP_OK 异常的处理,主UI 连网,开线程连接的简单实现方法_httpurlconnection.http_ok

httpurlconnection.http_ok

httpconn.getResponseCode()==HttpURLConnection.HTTP_OK异常
的简单处理办法

安卓升级后,不再允许目标 超过 API 8 的 通过运行, 估计就是为了改善
性能,让新硬件可以充分发挥优势.多开几个线程,不等等,还能处理其他的任务
解决方案就是

  • 1.开线程运行连接
  • 2.把数据通过句柄消息发送给主UI 处理.
  • 3那些主UI 的所有的方法都只能通过消息.得到数据
//A 位置
 try{
    URL url=new URL(wikiSearchURL);
     HttpURLConnection httpconn=(HttpURLConnection)url.openConnection();
     //尽量简化,中国的超时,属性设置就不写了.
	if(httpconn.getResponseCode()==HttpURLConnection.HTTP_OK  ){//错误位置
	
	
		InputStreamReader inputStreamReader =new InputStreamReader
		(httpconn.getInputStream(), "utf-8");
		 int i;
         String content="";
          // 读取消息到 content 中
          while ((i = inputStreamReader.read()) != -1) {
                     content = content + (char) i;
          }
          //位置F
          //位置 C
          
          //位置 D
        inputStreamReader.close();
}
      httpconn.disconnect();
 }catch(IOException e){
       e.printStackTrace();
   }
   //B位置
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

以上就是错误的运行块

【下面开始 开新线程 运行出错的代码块】

下面的代码插入 A 位置

new Thread() { //线程
      //==================================
     DefaultHttpClient httpClient = new DefaultHttpClient();

     HttpGet httpget = new HttpGet(wikiSearchURL);

     ResponseHandler<String> responseHandler = new BasicResponseHandler();
     //===========================================
        @Override
         public void run() {
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
                        }
                }.start();
                //==================================
                //位置 E
                //主线程中的handle用来接收子线程中的Message以便更新UI
  • 1
  • 2
  • 3
  • 4
  • 5

上面的 插入B 位置
这样就完成了.开线性运行该网络连接.
不但是联网的代码需要在 开线程中,还有些, 更新
主UI 的方法,也不能直接使用,

下面就是如果将数据传递给主UI
代码尽量简化

下面的代码可以插入到 E 位置

                handler=new Handler(){  //开一个句柄 给线程来发消息
                        @Override
                        public void handleMessage(Message msg) {
                                if (msg!=null){ //没有识别(需要补起来,简化 略....)
                                        String content=(String)msg.obj;
                                        // 将获取的内容显示到界面上
                                        mShowWiki.setText(content);
                                }
                                super.handleMessage(msg);
                        }
                };

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

下面的代码插入 C 和 D 之间

 //==================================
      //抛出消息到队列
      // 子线程中的handle用来给主线程传递消息,
       // 但是主线程中的handle也要等待该Message,否则不会继续,然后更新UI

                Message msg = Message.obtain();              
                    msg.obj = content;
                    handler.sendMessage(msg);
//==================================
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

程序片段中使用的几个 属性

    private String wikiSearchURL="https://zh.wikipedia.org/w/api.php?action=opensearch&search=Android";
    private TextView mShowWiki;
    public Handler handler=null; 
   
  • 1
  • 2
  • 3
  • 4

引入的几个包

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;  //之所以要引入 looper 是为了 Toast 方法

import android.os.Message;
import android.widget.TextView;
import android.widget.Toast;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

【运行条件】
1.运行程序, 使用 API 19 的手机,通过.
2.运行的wiki 网址. 需要翻墙访问.
3.上面代码要放在 主线程UI 的 onCreate () 中

下面是 运行 Toast 的方法
这个方法 放在,类其他方法一起,

  //==================================
        //不能直接调用 Toast
        //==================================
        public void Toast_Looper (String toastString ) {

              final   String toastStringMsg=toastString;
                new Thread() {
                        @Override
                        public void run() {
                                super.run();
                                Looper.prepare();
                                try {
                                        Toast.makeText(getApplicationContext(), toastStringMsg, Toast.LENGTH_SHORT).show();
                                } catch (Exception e) {

                                }
                                Looper.loop();
                        }
                }.start();
        }
        //==================================

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

插入嗲吗参考位置 F

 Toast_Looper("完成读取");
 //在这里插入代码片
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/418833
推荐阅读
相关标签
  

闽ICP备14008679号