技术标签: 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;
}
}
更改系统变量添加JAVA_HOME的路径到正确的JDK目录
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是构建在Hadoop HDFS上的一个数据仓库,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能,其本质是将SQL转换为MapReduce程序。数据仓库是一个面向主题的、集成的、不可更新的、随时间变化的数据集合,它用于支持企业或组织的决策分析处理。Hive的表其实就是HDFS的目录/文件。1.Hive的体系结构 Hive默认采用的是Derby数据库进行元数据的..._hive删除内部表会删除数据吗
保存记录,防止忘记参考这位博主的_ffmpeg rtsp 提取关键帧
MyBatis获取参数值的两种方式(重点)
1、数字int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647 在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807class int(object): """ ...
在java的关键字中,static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们来了解一下final关键字及其用法。final关键字在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。1.修饰..._java 中的final关键字有哪些用法
首先请确保redis已经成功开启了通知功能,可参考《Redis 键空间通知》。Springboot demo文件目录如下:pom<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency>application.yml配置r_springboot整合redis消息通知
问题描述:图例(legend)分两行显示并且初始化设置不选中状态,需要点击两次不选中状态的图例才能变成选中状态问题分析:1、经过多次测试才发现,有多组图例的情况下,只有第一组图例初始化时设置不选中状态,才不会出现只有点击两次不选中状态的图例才会变成选中状态情况。解决办法:(1)将设置不选中状态的那组图例放于legend数组的第一个,具体步骤请查看以下博客。ECharts 图例(legend)分两行显示并且初始化设置不选中状态(2)将多组图例变成一组图例。..._echarts lengend 不选择
Geometry是ArcGIS Engine中使用最为广泛的对象集之一,用户在创建、删除、编辑和进行地理分析的时候,就是处理一个包含几何形体的矢量对象;除了显示要素意外,控件对象选择,要素符号化,标注要素,编辑要素都需要Geometry参与。图1是Geometry的主要几何对象模型图,接下来将一一介绍这些几何对象。几何对象Point:是一个0维的几何图形,具有X
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/...