Handler+Thread+Message模式 Android线程网络
2013-07-13 22:38
316 查看
package com.example.httpdownloader; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.net.HttpURLConnection; import java.net.URL; import android.R.integer; import android.R.string; import android.app.Activity; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { private Context mContext; private Button downButton; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext=this.getApplicationContext(); downButton=(Button)findViewById(R.id.button1); if(checkNetworkIsActive(mContext)) { Log.v("httpdownloader", "NetworkIsAvailabel"); } else { Log.v("httpdownloader", "Network Is Not Availabel"); } /*检查游戏版本*/ Log.v("current version", "current version= "+getCurrentVersionCode()); downButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub /*新建线程来处理网络访问*/ Thread thread=new Thread(){ @Override public void run(){ try { HttpDownloader httpdownloader=new HttpDownloader(); String txtcontentString= httpdownloader.downLoadText("http://www.thisisgame.com.cn/sample-page/"); Log.v("downloader", txtcontentString); int downback=httpdownloader.downloadFile("http://www.thisisgame.com.cn/darkelf_guard.zip", "", "darkelf_guard.zip"); Log.v("downloadback", "downback = " + downback); } catch (Exception e) { // TODO: handle exception Log.v("httpdownloader",e.getMessage()); } /*在线程run的时候发消息通知主线程更新界面等*/ Message message=handler.obtainMessage(); /*这里是传递参数*/ message.arg1=1212; //message.obj=; handler.sendMessage(message); } }; thread.start(); thread=null; } }); } final Handler handler=new Handler() { @Override public void handleMessage(Message msg) { /*在这里就可以对主线程进行更新*/ Log.v("httpdownloader", "handleMessage param"+ msg.arg1); } }; /*检查网络是否可用*/ public static boolean checkNetworkIsActive(final Context context) { boolean mIsNetworkAvailabel=false; ConnectivityManager cManager=(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info=cManager.getActiveNetworkInfo(); if(info!=null) { mIsNetworkAvailabel=info.isAvailable(); } return mIsNetworkAvailabel; } /*获取当前游戏版本*/ public int getCurrentVersionCode() { PackageManager manager=mContext.getPackageManager(); try { PackageInfo info=manager.getPackageInfo(mContext.getPackageName(), 0); int oldVersion=info.versionCode; return oldVersion; } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return -1; } } }
以上MainActivity
FileUtil.java
package com.example.httpdownloader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.os.Environment; public class FileUtil { private String SDCARDPATH; public String getSDPath(){ return SDCARDPATH; } public void setSDPath(String path) { SDCARDPATH=path; } public FileUtil() { SDCARDPATH=Environment.getExternalStorageDirectory()+"/"; } /*在SD卡下面创建文件*/ public File createSDFile(String filename) throws IOException { File file=new File(SDCARDPATH+filename); file.createNewFile(); return file; } /*在SD卡下面创建目录*/ public File createSDDir(String dirname) { File dir=new File(SDCARDPATH+dirname); dir.mkdir(); return dir; } /*判断文件是不是存在*/ public boolean isFileExist(String filename) { File file=new File(SDCARDPATH+filename); return file.exists(); } /*将InputStream写入SD卡中,InputStream从HttpURLConnection.getInputStream()返回*/ public File inputSD(String path,String fileName,InputStream inputstream) { File file=null; FileOutputStream outputstream=null; try { /*先创建目录*/ createSDDir(path); /*创建文件*/ file=createSDFile(path+fileName); /*从文件中获取到文件输出流*/ outputstream=new FileOutputStream(file); /*4K 每次写入*/ byte[] buffer=new byte[8*1024]; /*从文件输入流中每次读取4kb到文件输出流,即每次写4kb到文件*/ int size; while((size=inputstream.read(buffer,0,8*1024))!=-1) { outputstream.write(buffer,0,size); } } catch (IOException e) { // TODO: handle exception e.printStackTrace(); }finally{ try{ if(outputstream!=null) { outputstream.flush(); outputstream.close(); } }catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } return file; } }
HttpDownloader.java
package com.example.httpdownloader; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.R.integer; public class HttpDownloader { private URL url=null; BufferedReader br=null; /*下载文本文件*/ public String downLoadText(String strurl) { StringBuffer sb=new StringBuffer(); String lineString=null; BufferedReader brBufferedReader=null; try { url=new URL(strurl); HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); /* getInputStream()获取到字节流 封装成InputStreamReader,编程字符流 再封装成BufferedReader,就可以一行一行读取了 */ br=new BufferedReader(new InputStreamReader(urlConn.getInputStream())); while((lineString=br.readLine())!=null) { sb.append(lineString); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally { try { br.close(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } return sb.toString(); } /*下载文件到SDCard*/ /* 文件下载成功返回1 下载失败返回-1 文件已经存在返回0 */ public int downloadFile(String strurl,String path,String fileName) { InputStream inputstream=null; FileUtil fileutils=new FileUtil(); if(fileutils.isFileExist(path+fileName)) { /* 如果文件已经存在返回0 */ return 0; } else { try { url=new URL(strurl); HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection(); inputstream=urlConnection.getInputStream(); File file=fileutils.inputSD(path, fileName, inputstream); /*文件下载失败返回 -1 */ if(file==null) { return -1; } } catch (IOException e) { // TODO: handle exception e.printStackTrace(); return -1; /* 出现了异常也返回-1 */ } finally { try{ inputstream.close(); }catch (IOException e) { // TODO: handle exception e.printStackTrace(); } } } return 1; } }
相关文章推荐
- Android--Handler+Looper+MessageQueue+Thread线程之间的通信
- Android:Handler+Looper+MessageQueue+Thread(线程间的通信)随记
- Android : Thread, handler, messagequeue, message, Looper 的交互。
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- Android framework Handler\HandlerThread\Looper\Message\MessageQueue\
- Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等
- android Thread 非线程更新UI界面(handler,runOnUiThread)解决图片加载慢的问题
- 在Android中使用Handler和Thread线程
- Android中使用Thread+Handler实现非UI线程更新UI界面
- 在Android中使用Handler和Thread线程执行后台操作
- Android启动线程的两种方法——runOnUiThread和Handler
- Android使用Thread+Handler实现非UI线程更新界面
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- Android异步消息处理线程之----Looper+MessageQueue+Handler
- Android的线程使用来更新UI----Thread、Handler、Looper、Time...
- Android 不可缺少的异步(Thread、Handler、AsyncTask)实例解析(在独立线程中进行地理位置编码)
- Thread和Looper以及Handler和Message详解 Android开发必读
- Android中使用Handler和Thread线程执行后台操作
- Android消息处理机制——Looper,Handler,Message,MessageQueue,Thread