获取网络请求

本文介绍了一个在Android应用中发起网络请求并安全更新UI的方法。通过使用子线程进行网络请求,避免了在主线程中执行耗时操作,同时利用Handler机制在主线程中更新UI,确保了应用的响应性和稳定性。

**

获取网络请求

**public class MainActivity extends Activity {

private Button query;
private EditText input;
private TextView info;

private final int UPDATE_UI = 1;

@SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {

       switch (msg.what) {
           case UPDATE_UI :
               info.setText(msg.obj.toString());
               break;
       }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    query = findViewById(R.id.query);
    input = findViewById(R.id.input);
    info = findViewById(R.id.info);

  query.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {

         new Thread(
                 new Runnable() {
                     @Override
                     public void run() {
                         Log.i("TEST",Thread.currentThread().getName());

                         try {
                             queryPhonNumInfo(input.getText().toString());
                         } catch (IOException e) {
                             e.printStackTrace();
                         }


                     }
                 }
         ).start();
  /*new Thread(){
      @Override public void run() {
        super.run();
      }
    }.start();*/

      }
  });

}

private  String  baseUrlStr =  "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=";

  private void queryPhonNumInfo(String phonNum) throws IOException {
 //获取信息

     try {


         //1 定义 URL 地址
         URL url = new URL(baseUrlStr + phonNum);
         //http https ftp
         //ctrl + h 查看类的继承结构
         //URLConnection
         //ctrl + q 查看方法信息
         //2 打开连接
         HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
         //3 设置:请求方法;超时
         //请求 方法 GET POST
         urlConnection.setRequestMethod("GET");
         //超时设置
         //读取超时
         urlConnection.setReadTimeout(5000);
         //连接超时
         urlConnection.setConnectTimeout(5000);
         //4 连接并获取状态码
         int responseCode = urlConnection.getResponseCode();
         if (responseCode == 200) {
             //5 读取字节流转换成字符串结果
             String result = stream2String(urlConnection.getInputStream());
             //操作ui  子线程不要操作ui

             Message message = mHandler.obtainMessage(UPDATE_UI, result);
             //Message msg = new Message();
             mHandler.sendMessage(message);
             //info.setText(result);
         } else {
             Message message = mHandler.obtainMessage(UPDATE_UI, "error:" + responseCode);
             //info.setText("error: " + responseCode);
             mHandler.sendMessage(message);
         }

     }catch (MalformedURLException e) {
          e.printStackTrace();
     }catch (IOException e) {
         e.printStackTrace();
     }


  }

//将字节流转换成字符
private String stream2String(InputStream is) throws IOException {

            /*InputStream is;
    InputStreamReader isr;
    BufferedReader br;

    OutputStream os;
    OutputStreamWriter osw;
    BufferedWriter bw;*/

    InputStreamReader isr = new InputStreamReader(is, "gbk");
    BufferedReader br = new BufferedReader(isr);
    StringBuilder stringBuilder = new StringBuilder();

    for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()){

        stringBuilder.append(tmp);
    }

    return stringBuilder.toString();

}


//网络操作需要申请权限

//主线程不能做网络 及 耗时 操作

//子线程中不能更新ui

//Handler 线程间通信

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值