Android网络技术.

  • WebView的用法
  1. Android提供了一个WebView控件,该控件相当于在我们的应用程序内部嵌入了一个浏览器,从而展示各种各样的网页.

       

public class MainActivity extends AppCompatActivity {
    private WebView mWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取实例
        mWebView = (WebView) findViewById(R.id.web_View);
        //调用getSettings()方法可以设置一些浏览器的属性. 此处设置让WebView支持JavaScript脚本
        mWebView.getSettings().setJavaScriptEnabled(true);
        //该方法作用是当需要从一个网页跳转到另一个网页时,目标网页仍然在当前的webView中显示,不会去
        //调用系统的浏览器
        mWebView.setWebViewClient(new WebViewClient());
        //传入网址 展示相应的内容
        mWebView.loadUrl("http://www.baidu.com");
    }
}

运行注意添加网络访问权限.

  • 使用HTTP协议访问网络.
  1. HTTP协议的工作原理特别简单:客户端向服务端发出一条HTTP请求,服务端收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理.比如上面的WebView控件,其实也就是向百度的服务器发出了一条HTTP请求,接着服务器分析我们想要访问的是百度的网页,然后将该网页的HTML代码进行了返回,然后WebView再调用手机浏览器的内核对返回的HTML代码进行解析,将页面展示出来.
  • 使用HttpURLConnection
  1. 在过去,Android发送一条HTTP网络请求有两种方式,HttpURLConnection和HttpClient.不过由于HttpClient存在API数量过多,扩展困难等缺点,Android团队越来越不建议我们使用此方式.终于在Android6.0中HttpClient功能被完全移除,标志着此功能被正式弃用.因此我们学习一下官方建议使用的HttpURLConnection的用法.
  2. 首先获取HttpURLConnection的实例,一般只需new出一个URL对象,并且传入目标的网络地址,然后调用openConnection()方法即可.如下所示: URL url = new URL("http://www.baidu.com"); HttpURLConnection connection = (HttpURLConnection)url.openConnection();
  3. 在获取到HttpURLConnection的实例后,可以设置一下HTTP请求所使用的方法,常用的方法有两个:GET和POST.GET表示希望从服务器那里获取到数据,而POST则表示希望提交数据给服务器.写法如下:connection.setRequestMethod("GET");
  4. 接下来可以进行一些自由的定制了,比如设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头等,根据自己实际情况进行编写.写法如下:connection.setConnectionTimeout(10000);  connection.setReadTimeout(8000);
  5. 接着调用getInputStream()方法就可以获取到服务器返回的输入流了.剩下的任务就是对获取的输入流进行处理.:InputStream in = connection.getInputStream();
  6. 最后调用disconnect()方法将这个HTTP连接关闭掉.  connection.disconnect();
  • 示例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button mSend;
    private TextView mResponceText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSend = (Button) findViewById(R.id.send_request);
        mResponceText = (TextView) findViewById(R.id.responce_text);
        mSend.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.send_request:
                sendRequestWithHttpURLConnection();
                break;
        }
    }

    private void sendRequestWithHttpURLConnection() {
        //开启线程发起网络请求
        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                try {
                    URL url = new URL("http://www.baidu.com");
                    connection = (HttpURLConnection) url.openConnection();
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(8000);
                    connection.setReadTimeout(8000);
                    InputStream in = connection.getInputStream();
                    //对获取到的输入流就行读取
                    reader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder responce = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        responce.append(line);
                    }
                    showResponce(responce.toString());
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (reader != null) {
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null) {
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    private void showResponce(final String msg) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mResponceText.setText(msg);
            }
        });
    }
}

如果是想要提交数据给服务器该怎么办,只需将HTTP的请求方法改为POST,并在获取输入流之前将需要的数据写出即可,注意每条数据都应以键值对的形式存在.数据与数据之间用&符号隔开,比如向服务器提交用户名和密码,就可以这样写

connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=666666");
  • 使用OkHttp
  1. 简介: 网络请求除了使用HttpURLConnection外,还有开源的网路请求框架,OkHttp无疑是其中最出色的一个.OkHttp由Square公司开发,该公司在开源事业上贡献很多,除了OkHttp外还有Picasso、Retrofit等著名开源项目.OkHttp不仅在接口封装方面做的简单易用,就连在底层实现上也是自成一派,比起原生有过之而无不及,现在已经成了广大Android开发者首选的网络通信库.OkHttp的项目主页地址是:https://github.com/square/okhttp.
  2. 使用前首先在app/build.gradle文件的dependencies闭包中添加依赖:
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.2'
        testCompile 'junit:junit:4.12'
        compile'com.squareup.okhttp3:okhttp:3.4.1'
    }

    添加依赖会下载两个库,一个是OkHttp库,一个是Okio库,后者是前者的通信基础.OkHttp的具体用法.

            //创建实例
            OkHttpClient client = new OkHttpClient();
            //发起HTTP请求,创建Request对象. 可以在build()方法之前连缀很多方法来丰富该请求对象
            Request request = new Request.Builder().
                    url("http://www.baidu.com").
                    build();
            try {
                //调用OkHttp的newCall()来创建一个call对象然后调用execute()方法发送请求并获取返回数据
                Response response = client.newCall(request).execute();
                //response即为服务器返回的数据了,使用如下方法得到返回数据的具体内容.
                String responseData = response.body().toString();
    
            } catch (IOException e) {
                e.printStackTrace();
            }

    如果是发起一条POST请求会比GET请求稍微复杂一点,我们需要先创建出一个RequestBody对象来存放待提交的参数

    //构建一个RequestBody对象,将待传的参数添加进去
            RequestBody body = new FormBody.Builder().
                    add("username","admin").
                    add("password","123456").
                    build();
            //创建request对象 将body对象添加 调用post()方法
            Request request = new Request.Builder().
                    url("http://www.baidu.com").
                    post(body).
                    build();
            try {
                //OkHttp调用newCall()方法创建一个Call对象再调用execute()方法发起请求获取数据.
                Response response = client.newCall(request).execute();
            } catch (IOException e) {
                e.printStackTrace();
            }

     

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值