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

    xiaoxiao2021-03-25  82

    概念webView使用方法加载网页超链接和本地连接资源案例装载HTML和本地连接WebView装载HTML代码Http协议访问网络案例GetPost方法自定义Handle类用于给主线程发送信息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 “访问失败”; }

    转载请注明原文地址: https://ju.6miu.com/read-40801.html

    最新回复(0)