zoukankan      html  css  js  c++  java
  • 网络请求OkHttp的使用

     okHttp:

    1.okHttp是squere公司出的,在Android4.0以后盛行

    2.httpClient 在5.0中弃用,在6.0以Google的sdk中没有该api

    3.httpUrlConnection 系统自带的,用的比较频繁

    特点:连接效率高,可以异步和同步

    需要导入两个jar包:

    okhttp-3.0.0-RC1.jar  okio-1.6.0.jar(okhttp内部依赖okio)

    package fanggao.qf.okhttptest;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    import okhttp3.Callback;
    import okhttp3.OkHttpClient;
    import okhttp3.Request;
    import okhttp3.Response;
    import okhttp3.ResponseBody;
    
    public class MainActivity extends AppCompatActivity {
    
        private TextView textview;
        private static final String url = "http://m2.qiushibaike.com/article/list/text?page=1";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button button = (Button) findViewById(R.id.btn_download);
            textview = (TextView) findViewById(R.id.tv_text);
        }
        /**
         * 点击下载数据
         * @param view
         */
        public void onClick(View view){
            //同步的方式,需要在子线程中运行,否则报错
       /*     new Thread(new Runnable() {
                @Override
                public void run() {
                    getDataForGet();
                }
            }).start();*/
            //异步  ,不需要开启子线程
             getAsyncOkHttp();
        }
        /**
         * 异步:同时执行多个
         * 通过get请求获取数据
         *
         */
        private void getAsyncOkHttp() {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder().get().url(url).build();
            //异步:
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Request request, IOException e) {
                }
                @Override
                public void onResponse(Response response) throws IOException {
                    final String string = response.body().String();
                    Log.i("tag","------"+Thread.currentThread().getId());
                    //只能在主线程中进行UI操作
                    //在主线程中进行
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textview.setText(string);
                        }
                    });
                }
            });
        }
        /**
         * 同步:一次执行一个
         * 通过get请求获取数据
         */
        private void getDataForGet() {
            try {
            //1.声明okhttp客户端
            OkHttpClient okHttpClient = new OkHttpClient();
            //2.构造request
                //1.声明构造器 ,设置请求方式,设置请求参数
            Request request = new Request.Builder().get().url(url).build();
            //3.通过客户端执行请求,获得response
                Response response = okHttpClient.newCall(request).execute();
                //4,判断响应是否成功
                if(response.isSuccessful()){
                    //获得响应实体
                    ResponseBody body = response.body();
                    //获得string
                   final  String string = body.string();
                    //获得bytep[]
                    byte[] bytes = body.bytes();
                    //获得流
                    InputStream inputStream = body.byteStream();
                    //在主线程中进行
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textview.setText(string);
                        }
                    });
                }
                Log.i("tag",Thread.currentThread().getName());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    现象:

  • 相关阅读:
    iOS 笔记-AFN使用中的遇到的问题
    iOS 笔记-incompatible pointer types initializing 'NSMutableString *' with an expression of type 'NSString *'警告处理
    iOS 笔记-SRT视频字幕的解析与同步
    iOS-笔记 字符编码
    iOS-笔记 设置导航栏的样式
    iOS 笔记-自定义的导航栏按钮
    iOS 笔记-删除插件的方法
    iOS 笔记-关于用户交互的那些事
    iOS BUG整理--[__NSCFNumber length]: unrecognized selector sent to instance 崩溃解决
    iOS BUG整理-Data argument not used by format string的警告处理
  • 原文地址:https://www.cnblogs.com/fangg/p/5918282.html
Copyright © 2011-2022 走看看