WebView的使用(http协议访问网络Get和Post请求方式)

概念:

是一个开放的浏览器组件,是基于WebKit内核开发出来的,像苹果的Safari、Google Chrome浏览器都是通过WebView实现的,
而在Android系统之中,默认也提供了WebView组件的支持,用户可以直接使用WebView组件显示网页的内容,或者是将一些指定的HTML文件嵌入进来,
除了支持各个浏览器的“前进”、“后退”等功能之外,最为强大的是在WebView组件之中也支持JavaScript的操作。
android.webkit.WebView的继承结构如下所示:
java.lang.Object
? android.view.View
? android.view.ViewGroup
? android.widget.AbsoluteLayout
? android.webkit.WebView

webView使用方法(加载网页超链接和本地连接资源)

WebView控件浏览网页: 
    布局文件使用WebView控件
    使用loadUrl(url)方法加载网页
    AndroidManifest.xml文件配置网络访问权限
    <uses-permission android:name="android.permission.INTERNET"/>
     app:ptrMode="both"支持上拉和下拉刷新
    设置webviewClient 重写shouldOverrideUrlLoading方法

案例(装载HTML和本地连接):

public class MainActivity extends AppCompatActivity {
    private EditText et_url;
    private Button btn_open;
    private WebView wv;
    private ProgressBar pb;

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

    private void initView(){
        et_url= (EditText) findViewById(R.id.et_url);
        btn_open= (Button) findViewById(R.id.btn_open);
        wv= (WebView) findViewById(R.id.wv);
        pb= (ProgressBar) findViewById(R.id.pb);
        btn_open.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                wv.loadUrl(et_url.getText().toString());
            }
        });
        //设置输入的url在当前浏览器打开,不设置会提示打开新的浏览器
        wv.setWebViewClient(new MyClient());
        //设置加载进度条
        wv.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
              pb.setProgress(newProgress);//添加加载进程进度条
//                setTitle("Loading...");
//                if(newProgress==1){
//                    pb.setVisibility(View.GONE);
//                    setTitle("加载完成");
//                }
            }
        });
        //加载本地HTML文件,在main包下新建assets包,复制导入HTML文件夹
        wv.loadUrl("file:/android_asset/me/index.html");
        wv.getSettings().setBuiltInZoomControls(true);//支持缩放
        wv.getSettings().setJavaScriptEnabled(true);//允许支持JS脚本(网页动态效果)

    }
    class MyClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {//过时的方法用于sdk版本小于21的
            view.loadUrl(url);
            return super.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP)//当Sdk版本大于21时才能使用此方法
            view.loadUrl(request.getUrl().toString());
            return super.shouldOverrideUrlLoading(view, request);
        }
    }

WebView装载HTML代码(Http协议访问网络):

    布局文件使用WebView控件
    assets文件夹中放html代码
    使用loadUrl("file:/android_asset/.../xxx.html")载入html
  注:webview.getSettings().setJavaScriptEnabled(true);//启用javascript
      webview.getSettings().setBuiltInZoomControls(true);//控制页面缩放
      AndroidManifest.xml文件配置网络访问权限
      <uses-permissionandroid:name="android.permission.INTERNET"/>

案例Get+Post方法:

public class MainActivity extends AppCompatActivity {
private EditText et_user,et_password;
private Button btn_login;
private MyThread thread=null;
private MyHandle handle=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView(){
handle=new MyHandle();//实例化控件时候也实例化handle
et_user= (EditText) findViewById(R.id.et_user);
et_password= (EditText) findViewById(R.id.et_password);
btn_login= (Button) findViewById(R.id.btn_login);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//①实例化控件,给按钮添加点击事件,点击按钮启动子线程
if (thread==null){
thread=new MyThread();
thread.start();
}
}
});
}

/**
 * ②自定义子线程
 */
class MyThread extends Thread{
    //③重写run方法
    //访问网络,进行登录,把登录的结果利用handle发送到主线程,写一个访问网络的方法
    @Override
    public void run() {
        super.run();
        //⑤调用访问网络的方法,获取结果值
  //           String result= loginGet();
        String result=loginPost();
    //⑥子线程向主线程发送message,需要自定义handle
        Message message= handle.obtainMessage(1,result);
      handle.sendMessage(message);
        //发送过消息,线程置空,方便下次使用
        thread=null;
    }
}

自定义Handle类用于给主线程发送信息:

/**
* ⑦自定义Handle类,发送消息
*
*/
class MyHandle extends Handler{
//重写handleMessage方法
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 1:
Toast.makeText(MainActivity.this,msg.obj.toString(),Toast.LENGTH_SHORT).show();
break;
}

Get请求方式:

/**
* ④定义一个访问网络的方法
*get请求方式,明文传参
*/
private String loginGet(){
String username=et_user.getText().toString();
String password=et_password.getText().toString();
String strurl=null;
//输入框非空验证
if(username!=null&&password!=null){
strurl=”http://192.168.15.114:8080/HttpTest/Login?username=”+username+”&password=”+password;
}
try {
URL url=new URL(strurl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();//打开连接
conn.setRequestMethod(“GET”);//设置请求方式,大写的GET
//获取请求结果
int code=conn.getResponseCode();
if(code==200){//请求成功,返回请求结果码200,读取流结果
InputStream is=conn.getInputStream();//获取流文件
InputStreamReader isr=new InputStreamReader(is);//读取流文件
BufferedReader reader=new BufferedReader(isr);//一次读一行
String line=”“;//定义空行用于追加内容
StringBuffer buffer=new StringBuffer();
while ((line=reader.readLine())!=null){//如果还没有读完
buffer.append(line);//一直追加内容
}
//关闭流,断开连接
reader.close();
conn.disconnect();
//返回获取到的请求结果
return buffer.toString();
}else {
return “访问失败”;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return “访问失败”;
}

Post请求方式:

/**
* post请求方法
* 与get请求就只有发送数据的方式不同,不是明文传参
*/
private String loginPost(){
String username=et_user.getText().toString();
String password=et_password.getText().toString();
String strurl=null;
String data=null;
//输入框非空验证
if(username!=null&&password!=null){
strurl=”http://192.168.15.114:8080/HttpTest/Login”;
data=”username=”+username+”&password=”+password;
}
try {
URL url=new URL(strurl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();//打开连接
// conn.setRequestMethod(“GET”);//设置请求方式,大写的GET
conn.setRequestMethod(“POST”);//设置请求方式为POST
//允许输入输入数据的设定,允许输入和输出,将数据date写入内存
conn.setDoInput(true);
conn.setDoOutput(true);
//设置请求的头
conn.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);
conn.setRequestProperty(“Charset”, “utf-8”);
conn.setRequestProperty(“Content-Length”, “” + data.getBytes().length);
//将data数据写入内存
OutputStream os=conn.getOutputStream();
os.write(data.getBytes());
os.flush();//刷新内存中的数据
//获取请求结果
int code=conn.getResponseCode();
if(code==200){//请求成功,返回请求结果码200,读取流结果
InputStream is=conn.getInputStream();//获取流文件
InputStreamReader isr=new InputStreamReader(is);//读取流文件
BufferedReader reader=new BufferedReader(isr);//一次读一行
String line=”“;//定义空行用于追加内容
StringBuffer buffer=new StringBuffer();
while ((line=reader.readLine())!=null){//如果还没有读完
buffer.append(line);//一直追加内容
}
//关闭流,断开连接
reader.close();
conn.disconnect();
//返回获取到的请求结果
return buffer.toString();
}else {
return “访问失败”;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return “访问失败”;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值