第三十六天 网络连接、单线程、多线程下载
2015-09-13 09:47
513 查看
网络连接:MyNetwork
布局:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"/> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="网络连接"/> <ProgressBar style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="20dp" android:id="@+id/progressbar"/> <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_erro" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"/> </FrameLayout> </LinearLayout>
权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission>
MainActivity
public class MainActivity extends Activity implements View.OnClickListener{ private Button mButton; private TextView mTextView; private ConnectivityManager mManager; private WebView mWebView;//网页 private TextView mTextViewErro;//显示网页错误 private ProgressBar mProgressBar;//网页加载进度条 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton= (Button) findViewById(R.id.button); mTextView= (TextView) findViewById(R.id.textview); mWebView= (WebView) findViewById(R.id.webview); mTextViewErro= (TextView) findViewById(R.id.textview_erro); mProgressBar= (ProgressBar) findViewById(R.id.progressbar); mButton.setOnClickListener(this); mTextView.setOnClickListener(this); mManager= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); mWebView.setWebViewClient(new WebViewClient()); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); mProgressBar.setProgress(newProgress);//设置进度条 } }); mWebView.setWebViewClient(new WebViewClient(){ //开始加载网页 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); mProgressBar.setVisibility(View.VISIBLE);//显示进度条 } //网页加载完成 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mProgressBar.setVisibility(View.INVISIBLE);//不显示进度条 } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); mWebView.setVisibility(View.GONE); Toast.makeText(getApplicationContext(),"网页错误",Toast.LENGTH_LONG).show(); mTextViewErro.setText("加载失败");//设置textview文本内容 mTextViewErro.setVisibility(View.VISIBLE);//设置Textview可见 } }); } //返回上一页面,而不会直接退出程序 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ if(mWebView.canGoBack()){ mWebView.goBack(); return true; } }else { MainActivity.this.finish(); } return super.onKeyDown(keyCode, event); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: // mWebView.loadUrl("ht2113tp://www.b24533355aidu.com"); mWebView.loadUrl("http://www.baidu.com"); // NetworkInfo info=mManager.getActiveNetworkInfo(); // if(info!=null&&info.isConnected()){ // Toast.makeText(getApplicationContext(),"有网络连接",Toast.LENGTH_LONG).show(); // mTextView.setText("网络连接为:"+info.getTypeName()); // }else { // Toast.makeText(getApplicationContext(),"无网络连接",Toast.LENGTH_LONG).show(); // mTextView.setText("无网络连接"); // } break; default: break; } } }
显示网页:
正在加载时显示进度条:
加载完成后不显示进度条:
Webview:(网址错误时
)
单线程、多线程下载
多线程下载图示:NetworkDemo:
IndexActivity:(通过IndexActivity直接启动其他界面)权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
public class IndexActivity extends Activity implements View.OnClickListener { private Button mButtonHttp; private Button mButtonDownLoad; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_index); mButtonHttp= (Button) findViewById(R.id.button_http); mButtonDownLoad= (Button) findViewById(R.id.button_download); mButtonHttp.setOnClickListener(this); mButtonDownLoad.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button_download: Intent intent=new Intent(IndexActivity.this,DownloadActivity.class); startActivity(intent);//启动线程下载界面 break; case R.id.button_http: Intent intent2=new Intent(IndexActivity.this,MainActivity.class); startActivity(intent2);//启动URL连接界面 break; } } }
MainActivity:(URL连接界面)
public class MainActivity extends Activity implements View.OnClickListener{ private Button mButton; private TextView mTextView; public static final int URL_CONTENT=0X23; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case URL_CONTENT: String content= (String) msg.obj; mTextView.setText(content); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton= (Button) findViewById(R.id.button); mTextView= (TextView) findViewById(R.id.textview); mButton.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button: new Thread(new Runnable() { @Override public void run() { urlConnection(); } }).start(); break; default: break; } } public void urlConnection(){ try { //URL url=new URL("http://www.360.com"); URL url=new URL("http://192.168.0.85:8080/JavaEE"); URLConnection connection=url.openConnection(); InputStream is=connection.getInputStream(); BufferedReader br=new BufferedReader(new InputStreamReader(is)); String line=br.readLine(); StringBuffer buffer=new StringBuffer(); while(line!=null){ Log.d("line",line); buffer.append(line); line=br.readLine(); } Message message=handler.obtainMessage(); message.what=URL_CONTENT; message.obj=buffer.toString().trim(); handler.sendMessage(message); is.close(); br.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
URL url=new URL(“http://www.360.com“)
URL url=new URL(“http://192.168.0.85:8080/JavaEE“)
DownLoadActivity:
public class DownloadActivity extends Activity implements View.OnClickListener{ private Button mButtonSingle; private ProgressBar mProgressBar; private Button mButtonMore; private static final int MESSAGE_THREAD=0X23; private int length; //多线程下载,用handler实现 private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case MESSAGE_THREAD: mProgressBar.setProgress (msg.arg1*100/length);//设置多线程下载进度条 break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_download); mButtonSingle= (Button) findViewById(R.id.button_single); mProgressBar= (ProgressBar) findViewById(R.id.progressbar); mButtonMore= (Button) findViewById(R.id.button_more); mButtonSingle.setOnClickListener(this); mButtonMore.setOnClickListener(this); } //AsynTask实现单线程下载 class MyTask extends AsyncTask<String,Integer,String>{ @Override protected String doInBackground(String... strings) { try { URL url=new URL("http://192.168.0.85:8080/JavaEE/photo/view.png"); URLConnection connection=url.openConnection(); length=connection.getContentLength(); InputStream is=connection.getInputStream(); File file=new File(Environment.getExternalStorageDirectory(),"view.png"); if(!file.exists()){ file.createNewFile(); } FileOutputStream os=new FileOutputStream(file); byte[] array=new byte[1024]; int sum=0; int i=is.read(array); while(i!=-1){ os.write(array,0,i); sum+=i; publishProgress(sum,length); i=is.read(array); } os.flush(); os.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); mProgressBar.setProgress((int) (values[0]*100.0/values[1]));//设置单线程下载进度条 } } @Override public void onClick(View view) { switch (view.getId()){ case R.id.button_single: MyTask task=new MyTask(); task.execute(); break; case R.id.button_more: //多线程下载 new Thread(new Runnable() { @Override public void run() { String urlPath="http://192.168.0.85:8080/JavaEE/photo/view.png"; try { URL url=new URL(urlPath); URLConnection connection=url.openConnection(); int length=connection.getContentLength(); File file=new File(Environment.getExternalStorageDirectory(),"a.png"); if(!file.exists()){ file.createNewFile(); } MultiThread[] threads=new MultiThread[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),urlPath,file.getAbsolutePath()); } thread.start(); threads[i]=thread; } boolean isFinish=true; while(isFinish){ int sum=0; for(MultiThread thread:threads){ sum+=thread.getSum(); } Message message=handler.obtainMessage(); message.what=MESSAGE_THREAD; message.arg1=sum; handler.sendMessage(message); if(sum+10>=length){ isFinish=false; } Thread.sleep(1000); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); break; } } }
MultiThraed:(多线程下载)
public class MultiThread extends Thread { private long start; private long end; private String urlPath; private String filePath; private int sum=0; public int getSum() { return sum; } public MultiThread(long start, long end, String urlPath, String filePath) { this.start = start; this.end = end; this.urlPath = urlPath; this.filePath = filePath; } @Override public void run() { try { URL url=new URL(urlPath); URLConnection connection=url.openConnection(); connection.setRequestProperty("Range","bytes="+start+"-"+end); InputStream is=connection.getInputStream(); File file=new File(filePath); if(!file.exists()){ file.createNewFile(); } RandomAccessFile randomAccessFile=new RandomAccessFile(file,"rw"); randomAccessFile.seek(start); byte[] array=new byte[1024]; int i=is.read(array); while(i!=-1){ randomAccessFile.write(array,0,i); sum+=i; i=is.read(array); } randomAccessFile.close(); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } super.run(); } }
——————————————-
相关文章推荐
- 通过NodeJS,Express搭建本地HTTP访问服务.
- TCP/IP协议三次握手与四次握手流程解析
- Android的HttpURLConnection总结
- IOS开发指南学习——使用MKNetworkKit进行网络请求
- 终极二进制分析TCP协议通信的过程和字段含义
- ARP实例分析-wireshark捕获的网络报文,二进制解析每个bit位对应的意思
- http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html(重要)
- Linux C语言程序设计(十八)——基于TCP的网络编程
- HTTP协议报文、工作原理及Java中的HTTP通信技术详解
- ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com
- ipv6现状,加英文的中括号访问, ipv6测试http://test-ipv6.com
- HDU 5012 Dice (2014年西安赛区网络赛F题)
- 网络请求配置
- 【转载】HTTP 头部解释
- HTTP响应状态码大全
- Android 网络连接——URLConnection
- http://mikewang.blog.51cto.com/3826268/1263802/
- 若操作系统没有加载网卡驱动,网卡虽然在系统设备树上,但网卡接口创建不了,那网卡实际能不能接收到数据?
- 网线上传输的是模拟信号还是数字信号?
- iOS开发: 网络解析数据之JSON解析