android多线程下载技术详解

android多线程下载技术详解
android多线程下载技术详解

Android 多线程、断点续传下载技术

1.为什么使用该技术?

答:(1)之所以采用多线程下载是因为考虑到手机,及移动设备的cup处理能力,让下载任务多抢占cup资源,从而加快了下载的速度,提高了用户体验

(2)断点续传技术,就是在下载过程中如果网络出现问题,导致文件没有下载完,那么下次下载时,接着上次终端位置继续下载,从而减轻了服务器的负担。

2.下面我们就开始建一个多线程下载的项目,来体验多线程下载的优势,项目的结构如下

2.1设计UI

main.xml

代码如下:

xmlns:android="https://www.360docs.net/doc/7712854944.html,/apk/res /android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="@string/path"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="https://www.360docs.net/doc/7712854944.html,/kcn/pc/K anbox_10012.exe"

android:id="@+id/path"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@string/button"

android:id="@+id/button"

/>

android:layout_width="fill_parent"

android:layout_height="20px"

style="?android:attr/progressBarStyleHorizontal"

android:id="@+id/downloadbar"

/>

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:id="@+id/result"

/>

其中引用的string.xml如下:

Hello World, SmartDownload!

SMART多线程断点下载器

下载路径

下载

下载完成

下载失败

SDCard不存在或者写保护

3.数据库阶段:

3.1编写数据库工具类DBOpenHeler

package com.smart.db;

import android.content.Context;

import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {

private static final String DBNAME = "smart.db";

private static final int VERSION = 1;

public DBOpenHelper(Context context) {

super(context, DBNAME, null, VERSION);

}

@Override

public void

db.execSQL("CREATE TABLE IF NOT EXISTS SmartFileDownlog (id integer primary key autoincrement, downpath varchar(100), threadid INTEGER, downlength INTEGER)");

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS SmartFileDownlog");

onCreate(db);

}

}

3.2对各个线程的下载记录进行数据库的操作,编写Fileservice 类

代码如下

package com.smart.db;

import java.util.HashMap;

import java.util.Map;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase; /**

* 业务bean

*

*/

public class FileService {

private DBOpenHelper openHelper;

public FileService(Context context) { openHelper = new DBOpenHelper(context);

}

/**

* 获取每条线程已经下载的文件长度

* @param path

* @return

*/

public Map getData(String path){

openHelper.getReadableDatabase();

Cursor cursor = db.rawQuery("select threadid, downlength from SmartFileDownlog where downpath=?", new String[]{path});

Map data = new

HashMap();

while(cursor.moveToNext()){

data.put(cursor.getInt(0),

cursor.getInt(1));

}

cursor.close();

db.close();

return data;

}

/**

* 保存每条线程已经下载的文件长度

* @param path

* @param map

*/

public void save(String path, Map map){//int threadid, int position

openHelper.getWritableDatabase();

db.beginTransaction();

try{

for(Map.Entry entry : map.entrySet()){

db.execSQL("insert into

SmartFileDownlog(downpath, threadid, downlength) values(?,?,?)",

new Object[]{path, entry.getKey(), entry.getValue()});

}

db.setTransactionSuccessful();

}finally{

db.endTransaction();

}

db.close();

}

/**

* 实时更新每条线程已经下载的文件长度

* @param path

* @param map

*/

public void update(String path, Map map){

SQLiteDatabase db =

openHelper.getWritableDatabase();

db.beginTransaction();

try{

for(Map.Entry entry : map.entrySet()){

db.execSQL("update SmartFileDownlog set downlength=? where downpath=? and threadid=?",

new Object[]{entry.getValue(), path, entry.getKey()});

}

db.setTransactionSuccessful();

}finally{

db.endTransaction();

}

db.close();

}

/**

* 当文件下载完成后,删除对应的下载记录

* @param path

*/

public void delete(String path){

SQLiteDatabase db =

openHelper.getWritableDatabase();

db.execSQL("delete from SmartFileDownlog where downpath=?", new Object[]{path});

db.close();

}

}

4.实现文件下载阶段

4.1建立SmartFileDownloader类

用来实现文件的下载功能

代码如下

package com.smart.impl;

import java.io.File;

import java.io.RandomAccessFile;

import https://www.360docs.net/doc/7712854944.html,.HttpURLConnection;

import https://www.360docs.net/doc/7712854944.html,.URL;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.UUID;

import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher;

import java.util.regex.Pattern;

import android.content.Context;

import android.util.Log;

import com.smart.db.FileService;

public class SmartFileDownloader {

private static final String TAG = "SmartFileDownloader";

private Context context;

private FileService fileService;

/* 已下载文件长度 */

private int downloadSize = 0;

/* 原始文件长度 */

private int fileSize = 0;

/* 线程数 */

private SmartDownloadThread[] threads;

/* 本地保存文件 */

private File saveFile;

/* 缓存各线程下载的长度*/

private Map data = new ConcurrentHashMap();

/* 每条线程下载的长度 */

private int block;

/* 下载路径 */

private String downloadUrl;

/**

* 获取线程数

*/

public int getThreadSize() {

return threads.length;

}

/**

* 获取文件大小

* @return

*/

public int getFileSize() {

return fileSize;

}

* 累计已下载大小

* @param size

*/

protected synchronized void append(int size) { downloadSize += size;

}

/**

* 更新指定线程最后下载的位置

* @param threadId 线程id

* @param pos 最后下载的位置

*/

protected void update(int threadId, int pos) { this.data.put(threadId, pos);

}

/**

* 保存记录文件

*/

protected synchronized void saveLogFile() { this.fileService.update(this.downloadUrl, this.data);

}

* 构建文件下载器

* @param downloadUrl 下载路径

* @param fileSaveDir 文件保存目录

* @param threadNum 下载线程数

*/

public SmartFileDownloader(Context context, String downloadUrl, File fileSaveDir, int threadNum) {

try {

this.context = context;

this.downloadUrl = downloadUrl;

fileService = new

FileService(this.context);

URL url = new URL(this.downloadUrl);

if(!fileSaveDir.exists())

fileSaveDir.mkdirs();

this.threads = new

SmartDownloadThread[threadNum];

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setConnectTimeout(5*1000);

conn.setRequestMethod("GET");

conn.setRequestProperty("Accept",

"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,

application/xaml+xml,

application/vnd.ms-xpsdocument,

application/x-ms-xbap,

application/x-ms-application,

application/vnd.ms-excel,

application/vnd.ms-powerpoint, application/msword, */*");

conn.setRequestProperty("Accept-Language", "zh-CN");

conn.setRequestProperty("Referer", downloadUrl);

conn.setRequestProperty("Charset",

"UTF-8");

conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR

2.0.50727; .NET CLR

3.0.04506.30; .NET CLR

3.0.4506.2152; .NET CLR 3.5.30729)");

conn.setRequestProperty("Connection", "Keep-Alive");

conn.connect();

printResponseHeader(conn);

if (conn.getResponseCode()==200) {

this.fileSize =

conn.getContentLength();//根据响应获取文件大小

if (this.fileSize <= 0) throw new RuntimeException("Unkown file size ");

String filename = getFileName(conn);

this.saveFile = new File(fileSaveDir, filename);/* 保存文件 */

Map logdata = fileService.getData(downloadUrl);

if(logdata.size()>0){

for(Map.Entry entry : logdata.entrySet())

data.put(entry.getKey(),

entry.getValue());

}

this.block = (this.fileSize %

this.threads.length)==0? this.fileSize /

this.threads.length : this.fileSize /

this.threads.length + 1;

if(this.data.size()==this.threads.length){

for(int i = 0; i < this.threads.length; i++) {

this.downloadSize +=

this.data.get(i+1);

}

print("已经下载的长度"+

this.downloadSize);

}

}else{

throw new RuntimeException("server no response ");

}

} catch (Exception e) {

print(e.toString());

throw new RuntimeException("don't connection this url");

}

}

/**

* 获取文件名

*/

private String getFileName(HttpURLConnection conn) {

String filename =

this.downloadUrl.substring(https://www.360docs.net/doc/7712854944.html,stI ndexOf('/') + 1);

if(filename==null ||

"".equals(filename.trim())){//如果获取不到文件名称for (int i = 0;; i++) {

String mine = conn.getHeaderField(i);

if (mine == null) break;

if("content-disposition".equals(conn.getHeader FieldKey(i).toLowerCase())){

Matcher m =

https://www.360docs.net/doc/7712854944.html,pile(".*filename=(.*)").matcher(mine.t oLowerCase());

if(m.find()) return m.group(1);

}

}

filename = UUID.randomUUID()+ ".tmp";//默认取一个文件名

}

return filename;

}

/**

* 开始下载文件

* @param listener 监听下载数量的变化,如果不需要了解实时下载的数量,可以设置为null

* @return已下载文件大小

* @throws Exception

*/

public int

download(SmartDownloadProgressListener listener) throws Exception{

try {

RandomAccessFile randOut = new RandomAccessFile(this.saveFile, "rw");

if(this.fileSize>0)

randOut.setLength(this.fileSize);

多线程技术在Android手机开发中的运用

龙源期刊网 https://www.360docs.net/doc/7712854944.html, 多线程技术在Android手机开发中的运用 作者:谢光刘志惠 来源:《电子技术与软件工程》2017年第24期 摘要 在Android手机开发过程中,一般情况下程序是通过一个线程进行工作的,因此当一个任务耗费过长时间,就会造成主程序无响应并对程序运行的顺畅程度造成影响的问题。基于此,本文通过对多线程组成进行介绍,在Android中多线程技术模块与具体实现方式两方面对多线程技术在安卓手机开发中的运用进行探讨,以为关注此问题的人们提供参考。 【关键词】多线程技术 Android手机进程线程 安卓系统自2007年由谷歌公司开发后,得到了巨大的发展。截至2017年3月,其市场占有率已经达到86.4%,如三星、索尼爱立信、小米、OPPO等手机生产厂商都在使用安卓系统。该系统开源免费、执行效率高,其多线程技术开发应用的研究,对提高手机硬件的利用效率,给用户带来良好试用体验,提高手机厂商的企业竞争力有重要作用。 1 多线程介绍 1.1 进程和线程介绍 一般来说,在一定时间内实现多个程序任务执行的程序都会用到“进程”这一概念。进程,即:一个拥有自身独立的内存空间、系统资源的执行程序,其特征为实现内部状态和内部数据的相互独立。线程与进程相似,线程也是一段有一定功能代码组成的流控制。线程的特征为:同类的多个线程可以对内存空间与系统资源进行共享。因此在对资源的占用方面,可以相互切换的线程比进程小很多。一个进程中可以包含诸多线程,此外,主线程对子线程有控制作用,可对子线程启动、停止等动作进行管理。而本文要重点介绍的多线程,指的是单个程序中一起运行的不同线程,不同线程可以执行不一样的任务。其特征是一个程序的多行语句可在某时间同时执行。 1.2 多线程程序消息处理原理 当人们启动一个程序时,系统将建立main线程,主要管理如:activity等应用组件,并对UI相关的事件进行处理,比如用户想要按键或使用屏幕进行绘图,线程会对以上事件进行处理,这是UI线程。安卓的线程模型,所有组件均在main线程中,因此用户在程序中下达下载文件、使用数据库等具有高耗时特征的操作时,就会造成UI线程的运行不畅,并出现程序无法响应的问题。这就要求程序员使用多线程技术,在进行安卓多线程编写时,技术人员应注意以下两点:

Android下使用Http协议实现多线程断点续传下载

0.使用多线程下载会提升文件下载的速度,那么多线程下载文件的过程是: (1)首先获得下载文件的长度,然后设置本地文件的长度 HttpURLConnection.getContentLength(); RandomAccessFile file = new RandomAccessFile("QQWubiSetup.exe","rwd"); file.setLength(filesize);//设置本地文件的长度 (2)根据文件长度和线程数计算每条线程下载的数据长度和下载位置。 如:文件的长度为6M,线程数为3,那么,每条线程下载的数据长度为2M,每条线程开始下载的位置如下图所示。 例如10M大小,使用3个线程来下载, 线程下载的数据长度 (10%3 == 0 ? 10/3:10/3+1) ,第1,2个线程下载长度是4M,第三个线程下载长度为2M 下载开始位置:线程id*每条线程下载的数据长度 = ? 下载结束位置:(线程id+1)*每条线程下载的数据长度-1=? (3)使用Http的Range头字段指定每条线程从文件的什么位置开始下载,下载到什么位置为止, 如:指定从文件的2M位置开始下载,下载到位置(4M-1byte)为止 代码如下:HttpURLConnection.setRequestProperty("Range", "bytes=2097152-4194303"); (4)保存文件,使用RandomAccessFile类指定每条线程从本地文件的什么位置开始写入数据。 RandomAccessFile threadfile = new RandomAccessFile("QQWubiSetup.exe ","rwd"); threadfile.seek(2097152);//从文件的什么位置开始写入数据

AndroidUI之线程与进度对话框

//创建一个进度条对话框 final ProgressDialog progressdialog=new ProgressDialog(MainActivity.this); progressdialog.setTitle("测试"); progressdialog.setMessage("正在对话框与线程"); progressdialog.show();//显示对话框 //创建线程 new Thread(){ public void run(){ try{ sleep(1000);//时间间隔1秒 }catch(Exception e){ e.printStackTrace(); }finally{ progressdialog.dismiss();//卸载对话框对象 } } }.start(); 菜单的创建于事件监听 public boolean onCreateOptionsMenu(Menu menu) { int a=Menu.NONE;//声明菜单顺序ID int b=Menu.NONE+1; int c=Menu.NONE+2; int d=Menu.NONE+3; menu.add(0, 1, a, "a");//第一个参数:分组,第二个参数:菜单的Id, 第三个参数:菜单的顺序,第四个参数:显示菜单的文字 menu.add(1, 2, b, "b"); menu.add(2, 3, b, "c"); menu.add(2, 4, d, "d"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText(MainActivity.this,"a", 1).show(); break; case 2: Toast.makeText(MainActivity.this,"b", 1).show(); break;

android课程介绍

1.课程基本信息 课程编号:M21F58D10 课程名称:Android应用与开发 开设学期:第3学期 总学时:60 总学分:4 课程类别:岗位能力课程课程性质:必修课 适用专业:软件技术(移动应用开发) 责任单位:计算机与软件学院 2.课程定位 《Android应用与开发》课程是软件技术(移动应用开发方向)专业的岗位能力课程,课程的开设依据是软件技术专业人才培养目标和相关职业岗位(群)的能力要求,对本专业所面向的手机软件开发与测试、软件开发与项目管理等岗位所需要的知识、技能和素质目标的达成起支撑作用。 在课程设置上,前导课程有《Java程序设计》(M21F1611),《数据结构》(M21F232),后续课程有《移动互联网开发综合实训》(M21J57B10)、《毕业实习》(M21J991)。 3.课程设计思路 首先依据专业人才培养方案中关于人才培养目标的阐述,明确课程目标;其次,结合职业教育课程观、教学观、能力观,基于软件工程的开发过程,以项目化教学来组织课程内容,在课程内容的选择与排序中,以软件项目研发的不同阶段、典型任务为载体,将课程内容划分为互相联系的学习情景;第三,通过对各学习情景中学习目标、主要内容、授课方式、师生要求等各项内容的描述,来规范课程所要求的内容;第四,通过对课程内容的选取和组合,以一个完整的项目为载体,完成课程的实施;最后,通过对项目实施过程中各个环节的考察和评价,来完成对课程的评鉴与考核。 本课程在设计上本着懂方法,重应用的总体思路,突出体现职业教育的技能型、应用性特色,着重培养学生的实践应用技能,力求达到理论方法够用,技术技能过硬的目的。 4.课程建设基本理念 本课程按照理论实践一体、课内外互补、课堂教学与培优工程相结合的课程设计指导思想,以任务或项目为载体组织教学内容,突出学生的主体地位,实现“教、学、做”的有机融合;通过班级讲授、团队学习、个体辅导、展示交流、技能大赛等手段,实现从模仿到应用到创新的高职学生递进式培养。 本课程强调对学生职业岗位能力的培养和职业素养的养成,针对不同环节,采用特定的教学方法,有意识、有步骤地将职业能力的训练和职业素养的形成融入到实际的教学过程中。

Android应用程序开发完整训练:从零起步通过23个动手实战案例精通App开发

从零起步,24小时内通过23个动手实战案例,循序渐进的对Android商业级别的应用程序开发要点各个击破,依托于在多年的Android(6款完整的硬件产品和超过20款应用软件)开发和企业级培训经验(超过150期的次Android的企业内训和公开课),旨在在实务的基础之上帮助你完成任何复杂程序的高质量Android应用程序开发,让Android开发跟上想象的速度。最后,通过ActivityManagerService揭秘Android应用程序一切行为背后的核心根源,让你从此开发应用程序居高零下、举重若轻。 课程要点: 1,抽取Android应用开发中用到的最精华的Java技术加以剖析; 2,从零起步构建Android开发环境和编写并彻底剖析第一个Android程序; 3,彻底剖析不同Activity之间所有的交互模式; 4,根据商业化场景彻底剖析Android的生命周期及其使用的最佳时间; 5,使用JUnit测试Android业务代码; 6,掌握Android基本和核心的UI开发技术; 7,”Android商业化高级UI实战”是根据过去20多款商业级别Android应用程序开发尤其是类似CRM系统中最经典、最经常使用的技术抽取而成,掌握之后基本上不会在遇到UI 方面的难点; 8,细致剖析并实战Android性能测试,找出性能瓶颈,并进行代码优化,分享代码优化的最佳实践; 9,对数据的处理时Android绝大多数应用程序的核心,尤其是对CRM系统而言,这一天,我们会对Android中的本地数据处理方式及其商业使用场景进行彻底剖析和实战; 10,从SharedPreferences到内部文件系统,从SDCard操作到SQLite数据库,从XML 和JSON的解析于生成到数据共享统一接口ContentProvider,对Android本地的数据处理方式进行地毯式轰炸; 11,通讯录的操作的原理、流程和场景等进行了情景再现性的代码实战; 12,通过Android手机卫士商业级别的代码案例实战Android中BroadcastReceiver和Service; 13,根据过去20多款程序的商业实战总结出了能够解决基于HTTP协议的任意文件类型、任意大小文件的网络上传和下载,Android网络开发从此一劳永逸; 14,实战WiFi数据交换; 15,尤其是额外提到异步http框架,具备很强的商业价值; 16,Android横竖屏切换的经典场景、生命周期和解决方案; 17,实战构建多语言国际化的Android应用程序; 18,如何编译APK来提高应用的安全性; 19,如何反编译Android应用 20,通过Android中WebView的特性洞悉Android中JavaScript与Java相互沟通的密码,追寻浏览器和HTML5开发的架构和技术实现根源; 21,使用NDK等技术利用C/C++的高效性来提高应用程序的性能; 22,实现Android中以Looper、Handler、Message、MessageQueue为核心的线程间通信方式; 23,实战并剖析AsyncTask框架实现的源代码,并提出对AsyncTask缺陷的解决方案;

Android平台介绍及使用指导

Android平台介绍及使用指导 二○一○年二月 版本 1.0

目录 Android平台介绍 ................................................................................... - 4 -基本名词...................................................................................................................... - 5 - 操作方法介绍 .......................................................................................... - 6 - 手机按键介绍.............................................................................................................. - 6 - 快捷键介绍.................................................................................................................. - 6 - 信息功能介绍.............................................................................................................. - 7 - 联系人功能介绍........................................................................................................ - 11 - 通话记录功能介绍.................................................................................................... - 14 - 文本粘贴/复制功能介绍.......................................................................................... - 14 - Push Email(Moxier)功能介绍............................................................................ - 15 - 电子邮件功能介绍.................................................................................................... - 16 - 桌面功能介绍............................................................................................................ - 19 - 蓝牙功能介绍............................................................................................................ - 23 - Wifi功能介绍........................................................................................................... - 23 - 飞行模式功能介绍.................................................................................................... - 23 - CDMA数据链接介绍................................................................................................... - 24 - 黑屏解锁功能............................................................................................................ - 25 - 回复出厂设置............................................................................................................ - 26 - 应用程序设置............................................................................................................ - 26 - GPS设置..................................................................................................................... - 27 - 手机中英文语言切换................................................................................................ - 28 - 更换手机输入法........................................................................................................ - 29 - 数据线链接Android手机........................................................................................ - 29 - 手机测试模式进入方法............................................................................................ - 30 - 横屏显示介绍............................................................................................................ - 30 - 浏览器功能介绍........................................................................................................ - 31 - RSS功能介绍............................................................................................................ - 32 - Q/A- 34 -

Android UI线程分析

理解UI线程——swt, Android, 和Swing的UI机理 线程 在做GUI的时候, 无论是SWT, AWT, Swing 还是Android, 都需要面对UI线程的问题, UI线程往往会被单独的提出来单独对待, 试着问自己, 当GUI启动的时候, 后台会运行几个线程? 比如 1. SWT 从Main函数启动 2. Swing 从Main函数启动 3. Android 界面启动 常常我们被告知, 主线程, UI线程, 因此这里很多会回答, 有两个线程, 一个线程是Main, 另外一个是UI. 如果答案是这样, 这篇文章就是写给你的。 OK, 我们以SWT为例, 设计以下方案寻找答案, 第一步, 我们看能否找到两个线程: 1. 从Main中启动SWT的界面, 在启动界面前, 将Main所在的线程打印出来这里设计为Shell中嵌入一个Button 2. 点击Button, 运行一个耗时很长的操作, 反复修改Button的文字, 在该线程中打印该线程的名称 代码是这样的: 1.public static void main(String[] args) { 2.final Display display = Display.getDefault(); 3.final Shell shell = new Shell();

4. shell.setSize(500, 375); 5. shell.setText("SWT Application"); 6. shell.setLayout(new FillLayout()); 7. btn = new Button(shell, SWT.NULL); 8. btn.setText("shit"); 9. registerAction(); 10. shell.open(); 11. https://www.360docs.net/doc/7712854944.html,yout(); 12.while (!shell.isDisposed()) { 13.if (!display.readAndDispatch()) 14. display.sleep(); 15. } 16. shell.dispose(); 17. display.dispose(); 18.} 19.private static void registerAction() { 20. btn.addMouseListener(new MouseListener() { 21. @Override 22.public void mouseDoubleClick(MouseEvent e) { 23. // TODO Auto-generated method stub 24. } 25. @Override 26.public void mouseDown(MouseEvent e) { 27. methodA(); 28. } 29. @Override 30.public void mouseUp(MouseEvent e) { 31. } 32. }); 33.} 34./**

1.android发展历程简介

android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache 开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1] 2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。2014第一季度Android平台已占所有移动广告流量来源的42.8%,首度超越iOS。但运营收入不及iOS。 编程语言 C/C++(底层)Java等(应用层) 系统家族 类Unix,Linux 源码模式 自由及开放源代码软件 内核类型 宏内核(Linux内核) 软件许可 Apache License、GPL等 1系统简介编辑 Android一词的本义指“机器人”,同时也是Google于2007年11月5日 Android logo相关图片(36张) 宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。 Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l'Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L'ève future)中。他将外表像人的机器起名为Android。Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上

Android的线程使用来更新UI----Thread、Handler、Looper、TimerTask等

方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题new Thread( new Runnable() { public void run() { myView.invalidate(); } }).start(); 可以实现功能,刷新UI界面。但是这样是不行的,因为它违背了单线程模型:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 方法二:(Thread+Handler) 查阅了文档和apidemo后,发觉常用的方法是利用Handler来实现UI线程的更新的。Handler来根据接收的消息,处理UI更新。Thread线程发出Handler消息,通知更新UI。Handler myHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case TestHandler.GUIUPDATEIDENTIFIER: myBounceView.invalidate(); break; } super.handleMessage(msg); } }; class myThread implements Runnable { public void run() { while (!Thread.currentThread().isInterrupted()) { Message message = new Message(); message.what = TestHandler.GUIUPDATEIDENTIFIER; TestHandler.this.myHandler.sendMessage(message); try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } 以上方法demo看:https://www.360docs.net/doc/7712854944.html,/blog/411860 方法三:(java习惯,不推荐) 在Android平台中需要反复按周期执行方法可以使用Java上自带的TimerTask类, Tim erTask相对于Thread来说对于资源消耗的更低,除了使用Android自带的

Android SDK介绍

Android SDK介绍 1.Android SDK简介 即Android Software Development Kit.它提供了在Windows/Linux/Mac平台上开发Android应用的开发组件,包含了在Android平台上开发移动应用程序的各种工具集。 2.Android SDK tools 1.Android模拟器(Android Emulator(emulator.exe)) 运行在计算机上的虚拟移动模拟器,可以使用模拟器来在一个实际的Android运行环境下设计,调试和测试应用程序。 2.集成开发环境插件(Android Development Tools Plugin for the Eclipse IDE 即 ADT) 可以直接从Eclipse访问其他Android开发工具.通过它可以进行包括截屏,管理端口转发(port-forwarding),设置断点,观察线程和进程信息. (a)它提供了一个新的项目向导(New Project Wizard),用于快速生成和建立起新 Android应用程序所需的最基本的文件.

(b) 它使得构建Android应用程序的过程变得自动化以及简单化. (c) 它提供了一个android代码编辑器,用于为Android 的manifest和资源文件编写 有效的XML. 3..调试监视服务(Dalvik Debug Monitor Service(ddms.bat) 4.它集成在Dalvik(Android平台虚拟机)中,用于管理运行在模拟器或设备上的进程,并协 助进行调试.可以用它来去除进程,选择一个特定程序来调试,生成跟踪数据,查看堆和线程数据,对模拟器或设备进行屏幕快照等. 5..Android调试桥(Android Debug Bridge(adb.exe)) 6.它用于向模拟器或手机设备安装应用程序的apk文件和从命令行访问模拟器或手机设 备.也可以用于将标准的调试器连接到运行在android模拟器或手机设备上的应用代码. 7..Android资源打包工具(Andoird Asset Packing Tool(aapt.exe)) 8.可以通过aapt工具来创建apk文件,这些文件包含了android应用程序的二进制文件和 资源文件. 9..Android接口描述语言(Android Interface Description Language(aidl.exe)) 10.它用来生成进程间接口代码,在服务中便可用到. 11..SQLite3数据库(sqlit3(sqlite3.exe)) 12.Android应用程序可以创建和使用SQLite数据文件,开发者和使用者也可以方便的访问 这些数据文件. 13..跟踪显示工具(Traceview(traceview.exe)) 14.它可以生成跟踪日志数据的图形分析视图,这些跟踪日志数据由android因公程序产生. 15..创建SD卡工具(mksdcard(mksdcard.exe)) 16.它帮助创建磁盘镜像,这个磁盘镜像可以在模拟器上模拟外部存储卡. 17..DX工具(dx(dx.exe)) 18.它将class字节码重写为android字节码(存储到dex文件中). 19..生成Ant构建文件(activityCreator(activitycreator.bat)) 20.它是一个脚本.用来生成Ant构建文件,Ant构建文件用来编译android应用程序.若是在 安装了ADT插件的Eclipse环境下开发则不需要这个脚本. 21..Android虚拟设备(Android Virtual Devices AVD) 22.每个android虚拟设备(AVD)模拟了单一的虚拟设备来运行android平台,这个平台至 少要包括自己的内核,系统图像和数据分区.开发者可以创建并保存多种虚拟模拟器配置,每种配置环境有其自己的平台版本,硬件配置以及SD卡和用户数据,还可以有不同的显示外观等个性化设置,运行时只需要制定需要使用哪个.即可实现多平台下的模拟测试.

android多线程下载技术详解

Android 多线程、断点续传下载技术 1.为什么使用该技术? 答:(1)之所以采用多线程下载是因为考虑到手机,及移动设备的cup处理能力,让下载任务多抢占cup资源,从而加快了下载的速度,提高了用户体验 (2)断点续传技术,就是在下载过程中如果网络出现问题,导致文件没有下载完,那么下次下载时,接着上次终端位置继续下载,从而减轻了服务器的负担。 2.下面我们就开始建一个多线程下载的项目,来体验多线程下载的优势,项目的结构如下 2.1设计UI

main.xml 代码如下:

android:text="@string/path" />

相关文档
最新文档