Handler+Thread+Message模式 Android线程网络-程序员宅基地

技术标签: Android 多线程 网络访问  

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;
	}

}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cp790621656/article/details/9321483

智能推荐

AndroidStudio出现找不到JVM问题-程序员宅基地

更改系统变量添加JAVA_HOME的路径到正确的JDK目录

nmon常用监控指标_nmon可以监控的指标有哪些-程序员宅基地

nmon常用监控指标1、信息采集参数详解nmon -s10 -c60 -f -m /home-s10 每 10 秒采集一次数据。-c60 采集 60 次,即为采集十分钟的数据。-f 生成的数据文件名中包含文件创建的时间。-m 生成的数据文件的存放目录。2、生成一个 nmon 文件,并每十秒更新一次,直到十分钟后。生成的文件名如: dzl_161119_1301.nmon,“dzl” 是这台主机的主机名3、报表(UTF-8’en’nmon_analyser_v51_2.z_nmon可以监控的指标有哪些

Hive知识积累_hive删除内部表会删除数据吗-程序员宅基地

Hive是构建在Hadoop HDFS上的一个数据仓库,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能,其本质是将SQL转换为MapReduce程序。数据仓库是一个面向主题的、集成的、不可更新的、随时间变化的数据集合,它用于支持企业或组织的决策分析处理。Hive的表其实就是HDFS的目录/文件。1.Hive的体系结构 Hive默认采用的是Derby数据库进行元数据的..._hive删除内部表会删除数据吗

ffmpeg提取关键帧_ffmpeg rtsp 提取关键帧-程序员宅基地

保存记录,防止忘记参考这位博主的_ffmpeg rtsp 提取关键帧

Python全栈开发:基本数据类型-程序员宅基地

1、数字int(整型)  在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647  在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807class int(object): """ ...

随便推点

[java]final关键字的几种用法-程序员宅基地

在java的关键字中,static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们来了解一下final关键字及其用法。final关键字在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。1.修饰..._java 中的final关键字有哪些用法

Springboot + Redis:整合键消息通知_springboot整合redis消息通知-程序员宅基地

首先请确保redis已经成功开启了通知功能,可参考《Redis 键空间通知》。Springboot demo文件目录如下:pom<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>application.yml配置r_springboot整合redis消息通知

ECharts 图例(legend)分两行显示并且初始化设置不选中状态,需要点击两次不选中状态的图例才能变成选中状态问题解决_echarts lengend 不选择-程序员宅基地

问题描述:图例(legend)分两行显示并且初始化设置不选中状态,需要点击两次不选中状态的图例才能变成选中状态问题分析:1、经过多次测试才发现,有多组图例的情况下,只有第一组图例初始化时设置不选中状态,才不会出现只有点击两次不选中状态的图例才会变成选中状态情况。解决办法:(1)将设置不选中状态的那组图例放于legend数组的第一个,具体步骤请查看以下博客。ECharts 图例(legend)分两行显示并且初始化设置不选中状态(2)将多组图例变成一组图例。..._echarts lengend 不选择

arcengine之Geometry对象模型-程序员宅基地

Geometry是ArcGIS Engine中使用最为广泛的对象集之一,用户在创建、删除、编辑和进行地理分析的时候,就是处理一个包含几何形体的矢量对象;除了显示要素意外,控件对象选择,要素符号化,标注要素,编辑要素都需要Geometry参与。图1是Geometry的主要几何对象模型图,接下来将一一介绍这些几何对象。几何对象Point:是一个0维的几何图形,具有X

nodejs的安装及使用_安装nodejs后是使用cmd还是使用node.exe安装依赖-程序员宅基地

Node的安装及使用1 安装1 遇到下图选中Add to PATH 就行2 遇到下图不勾选3 检查是否安装成功(在cmd窗口操作)4 下载cnpm(包管理工具)5.报错处理2 使用1 在cmd窗口中切换到需要创建vue项目的文件夹下`在这里插入代码片`1 安装路径也不要改,除了下面有图标识的情况需要动,其它的都是默认选项如果已经安装的话,在安装完后再点击安装包,然后选择change就行1 遇到下图选中Add to PATH 就行这样就可以不用配置环境变量了2 遇到下图不勾选3 检查是否安_安装nodejs后是使用cmd还是使用node.exe安装依赖

品优购--代码生成器-程序员宅基地

generatorConfig.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/...