Android网络技术

查看当前网络连接

首先要得到ConnectivityManager对象,然后调用getActiveNetworkInfo()方法,返回一个NetworkInfo对象。

ConnectivityManager manager= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);NetworkInfo info=manager.getActiveNetworkInfo();

注意:查看网络连接要声明权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

WebView的用法

WebView通常用于在应用程序中展示一些网页,而不是用浏览器去加载和显示,借助WebView我们可以在应用程序中嵌入一个浏览器,从而展示各种各样的网页。
首先要在布局中加入一个WebView

<WebView  android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"></WebView>

然后使用findViewById()方法得到WebView的实例,然后调用getSettin()方法可以去设置一些浏览器的属性,这里只调用setJavaScriptEnabled()方法来让WebView支持JavaScript脚本。接着调用setWebViewClient()方法,并传入WebViewClient的匿名类作为参数,重写几个方法。最后调用WebView的loadUrl()方法,并传入网址即可。
最后,别忘了因为要访问网络,要声明访问网络的权限。

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

综合示例

这里点击按钮,用一个TextView显示当前网络连接类型。在下边用一个帧布局,展示一个WebView,加载时用progressBar显示加载进度。如果加载错误,显示自定义错误!
首先是布局xml文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">    <TextView  android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" />    <Button  android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="获取网络连接"/>    <FrameLayout  android:layout_width="match_parent" android:layout_height="match_parent">        <WebView  android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent"></WebView>        <TextView  android:id="@+id/textview_error" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" android:gravity="center" />        <ProgressBar  style="?android:attr/progressBarStyleHorizontal" android:id="@+id/progressbar" android:visibility="invisible" android:layout_width="match_parent" android:layout_height="wrap_content" />    </FrameLayout></LinearLayout>

MainActivity.java

import android.app.Activity;import android.graphics.Bitmap;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.os.Bundle;import android.view.View;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Button;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    private TextView textView;    private TextView textView_error;    private ConnectivityManager manager;    private WebView webview;    private ProgressBar progressBar;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        manager= (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);        textView= (TextView) findViewById(R.id.textview);        textView_error= (TextView) findViewById(R.id.textview_error);        webview= (WebView) findViewById(R.id.webview);        progressBar= (ProgressBar) findViewById(R.id.progressbar);        webview.getSettings().setJavaScriptEnabled(true);        webview.setWebViewClient(new WebViewClient(){            @Override            public void onPageStarted(WebView view, String url, Bitmap favicon) {//页面加载开始                super.onPageStarted(view, url, favicon);                progressBar.setVisibility(View.VISIBLE);            }            @Override            public void onPageFinished(WebView view, String url) {//页面加载结束                super.onPageFinished(view, url);                progressBar.setVisibility(View.INVISIBLE);            }            @Override            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {//页面加载错误                super.onReceivedError(view, errorCode, description, failingUrl);                webview.setVisibility(View.GONE);                textView_error.setVisibility(View.VISIBLE);                textView_error.setText("加载失败");            }        });        webview.setWebChromeClient(new WebChromeClient() {            @Override            public void onProgressChanged(WebView view, int newProgress) {//当前页面加载进度                super.onProgressChanged(view, newProgress);                progressBar.setProgress(newProgress);            }        });        webview.loadUrl("http://www.baidu.com");        Button button= (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                NetworkInfo info=manager.getActiveNetworkInfo();                if (info!=null&&info.isConnected()){                    Toast.makeText(getApplicationContext(), "有网络连接", Toast.LENGTH_SHORT).show();                    textView.setText(info.getTypeName());                }else{                    Toast.makeText(getApplicationContext(), "无网络连接", Toast.LENGTH_SHORT).show();                    textView.setText("无网络连接");                }            }        });    }    @Override    public void onBackPressed() {        if(webview.canGoBack()){            webview.goBack();//点击返回按钮,返回上一个WebView界面        }else {            finish();        }    }}

访问网络

在Android上发送HTTP请求的方式一般有两种,HttpURLConnection和HttpClient。

HttpURLConnection/URLConnection

注意: URLConnection和HttpURLConnection使用的都是java.net中的类,属于标准的java接口。HttpURLConnection继承自URLConnection,差别在与HttpURLConnection仅仅针对Http连接。
首先我们在布局中放一个按钮,点击请求一个页面,然后用一个TextView展示返回的内容。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">        <Button  android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="连接服务器"/>    <ScrollView  android:layout_width="match_parent" android:layout_height="match_parent">        <TextView  android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" />    </ScrollView></LinearLayout>

MainActivity.java

import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.TextView;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class MainActivity extends Activity {    private static final int CONECT_SERVLET=0x23;    private TextView textView;    private Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {           switch (msg.what){               case CONECT_SERVLET:                   String content= (String) msg.obj;                   textView.setText(content);                   break;               default:                   break;           }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView= (TextView) findViewById(R.id.textview);        Button button= (Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                new Thread(new Runnable() {//不能在主线程中连接网络,所有另开启线程                    @Override                    public void run() {                        conectServlet();                    }                }).start();            }        });    }    private void conectServlet() {        try {            //自己搭建的Tomcat服务器            URL url=new URL("http://192.168.0.56:8080/MyTomcat/hello.html");            //URL url=new URL("http://www.360.com");访问360网站            URLConnection connection=url.openConnection();            BufferedReader br=new BufferedReader(new InputStreamReader(connection.getInputStream()));            String line=br.readLine();            StringBuffer buffer=new StringBuffer();            while (line!=null){                buffer.append(line);                line=br.readLine();            }            Message message=handler.obtainMessage();            message.what=CONECT_SERVLET;            message.obj=buffer.toString();            handler.sendMessage(message);            br.close();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}

服务器返回的是网页的HTML代码

HttpClient

HttpClient是Apache提供的HTTP网络访问接口,从一开始的时候就被引入到了Android API中。(但是在Android6.0中删除了相关API,被OKHttp代替!)
使用步骤:
1. 创建HttpClient对象。
2. 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3. 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4. 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5. 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6. 释放连接。无论执行方法是否成功,都必须释放连接。
具体的代码示例,就不再写了,在前边的博客中也写了具体的用法。

访问网络下载文件

这里在布局中放入两个按钮,一个为单线程下载,一个为多线程下载。最上边放在一个progressBar显示当前下载的进度

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity">    <ProgressBar  android:id="@+id/progressbar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" />    <Button  android:id="@+id/button_single" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="单线程下载"/>    <Button  android:id="@+id/button_multi" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="多线程下载"/></LinearLayout>

然后创建一个多线程下载的类MultiThread继承Thread

import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;/** * Created by Administrator on 2015/9/13. */public class MultiThread extends Thread {    private int sum;    private long start;    private long end;    private String urlPath;//下载服务器地址    private String filePath;//下载文件存放路径    public MultiThread( long start,long end, String urlPath,String filePath) {        this.end = end;        this.filePath = filePath;        this.start = start;        this.urlPath = urlPath;    }    public int getSum() {        return sum;    }    @Override    public void run() {        try {            URL url=new URL(urlPath);            URLConnection connection=url.openConnection();            connection.setAllowUserInteraction(true);            connection.setRequestProperty("Range","bytes="+start+"-"+end);            InputStream is=connection.getInputStream();            byte[] array=new byte[1024];            File file=new File(filePath);            RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw");//随机读写文件            randomAccessFile.seek(start);            int index = is.read(array);            while (index!=-1){                randomAccessFile.write(array,0,index);                sum=sum+index;                index=is.read(array);            }            randomAccessFile.close();            is.close();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }}

这里用到RandomAccessFile类,用于随机读写文件,首先生产RandomAccessFile对象,然后调用seek()方法,用来控制访问开始的位置。

MainActivity.java

import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.ProgressBar;import android.widget.Toast;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class MainActivity extends Activity {    private ProgressBar progressbar;    private int length;    private Handler handler=new Handler(){        @Override        public void handleMessage(Message msg) {            switch (msg.what){                case 0x23:                    progressbar.setProgress((int) (msg.arg1*100.0/length));                    break;                default:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        progressbar= (ProgressBar) findViewById(R.id.progressbar);        Button button_single= (Button) findViewById(R.id.button_single);        button_single.setOnClickListener(new View.OnClickListener() {//单线程下载            @Override            public void onClick(View v) {                new DownloadTask().execute();            }        });        Button button_multi= (Button) findViewById(R.id.button_multi);        button_multi.setOnClickListener(new View.OnClickListener() {//多线程下载            @Override            public void onClick(View v) {                new Thread(new Runnable() {                    @Override                    public void run() {                        //String urlPath="http://192.168.0.30:8080/MyWebTest/music/aa.mp3";                        String urlPath="http://192.168.0.56:8080/MyTomcat/AhYeah.mp3";                        try {                            URL url=new URL(urlPath);                            URLConnection connection=url.openConnection();                            length=connection.getContentLength();                            File file=new File(Environment.getExternalStorageDirectory(),"AhYeah.mp3");                            if (!file.exists()){                                file.createNewFile();                            }                            MultiThread[] threads=new MultiThread[5];//这里开启5个线程下载                            for (int i=0;i<5;i++){                                MultiThread thread=null;                                if (i==4){                                    thread=new MultiThread(length/5*4,length,urlPath,file.getAbsolutePath());                                }else {                                    thread=new MultiThread(length/5*i,length/5*(i+1)-1,urlPath,file.getAbsolutePath());                                }                                thread.start();                                threads[i]=thread;                            }                            boolean isFinish=true;                            while (isFinish){                                int sum=0;                                for (MultiThread thread:threads){                                    sum=sum+thread.getSum();                                }                                Message message=handler.obtainMessage();                                message.what=0x23;                                message.arg1=sum;                                handler.sendMessage(message);                                if (sum>=length){                                    isFinish=false;                                }                                Thread.sleep(1000);                            }                        } catch (MalformedURLException e) {                            e.printStackTrace();                        } catch (IOException e) {                            e.printStackTrace();                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }).start();            }        });    }    class DownloadTask extends AsyncTask<String,Integer,String>{        @Override        protected String doInBackground(String... params) {            try {                //访问下载搭建的服务器下的图片                URL url=new URL("http://192.168.0.56:8080/MyTomcat/weheartit.png");                URLConnection connection=url.openConnection();                int length=connection.getContentLength();                File file=new File(Environment.getExternalStorageDirectory(),"weheartit.png");                if(!file.exists()){                    file.createNewFile();                }                InputStream is=connection.getInputStream();                OutputStream os=new FileOutputStream(file);                byte[] array=new byte[1024];                int sum=0;                int index=is.read(array);                while (index!=-1){                    os.write(array,0,index);                    sum=sum+index;                    publishProgress(sum,length);                    index=is.read(array);                }                os.flush();                os.close();                is.close();            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }            return "您好,文件已下载完成";        }        @Override        protected void onProgressUpdate(Integer... values) {            super.onProgressUpdate(values);            progressbar.setProgress((int)(values[0]*100.0/values[1]));        }        @Override        protected void onPostExecute(String s) {            super.onPostExecute(s);            Toast.makeText(getApplicationContext(), s, Toast.LENGTH_SHORT).show();        }    }}

更多相关文章

  1. Android 判断当前设备是手机还是平板的最有效的方法
  2. Android studio 学习1:实现点击事件的4种方法
  3. 解决方法:android 6.0(api 23) SDK,不再提供org.apache.http.*(只
  4. Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操
  5. 【Android笔记】Activity涉及界面全屏的方法
  6. Android快速开发框架之xUtils---网络模块
  7. Android使用HttpURLConnection请求网络返回JSON数据并解析
  8. Android Studio查看源码时出现Sources for ‘Android API 30 Pla
  9. Android中Canvas绘图方法的实现

随机推荐

  1. 网页局部打印
  2. Html5的datetime-local控件
  3. 缓存js / css资源以使我的项目脱机工作
  4. 使用html5中的base64数据播放音频。
  5. 如何在CSS中添加旋转图像?
  6. 我不能使用CSS顺序属性。
  7. html中插入activex控件之后 需要在 网页
  8. HTML5按钮元素新属性formaction,formenct
  9. 这几个编码分别代表什么意思?
  10. HTML5的本地存储