Android中的进程与多线程的讲解(Handler和AsyncTask)

  categories:android资料  tags:  author:

    Hello EveryBody,又到了我们相聚的时间了,今天要总结的东西现在有点迫不及待了,因为在实际的应用中如果用不到它,我们就不能再听歌的同时发送信息,其实大家应该都知道了,今天的主角就是进程与多线程,好了,其他的不多说,直接进入正题吧。

一.Android进程的分类:

(1)前台进程:即与用户正在交互的Activity或者Activity用到的Service等,如果系统内存不足时前台进程是最后被杀死的;

(2)可见进程:可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见,但由于失去了焦点而不能与用户交互;

(3)服务进程:其中运行着使用startService方法启动的Service,虽然不被用户可见,但是却是用户关系的,例如用户正在非音乐界面听的音乐或者正在非下载页面自己下载的文件等;当系统要用空间运行前两者进程时才会被终止;

(4)后台进程:其中运行着执行onStop方法而停止的程序,但是却不是用户当前关心的,例如后台挂着的QQ,这样的进程系统一旦没有内存就首先被杀死;

(5)空进程:不包含任何应用程序的程序组件的进程,这样的进程系统是一般不会让他存在的;

二.进程与多线程的深入

1.由于单线程而导致的ANR错误:

ANR错误(Application Not Responding),指主UI进程被阻塞超过5秒钟而出现的错误,它会终止程序的正常运行,我们要避免它 ,而产生ANR错误的原因就是:单线程。

例子如下:

package com.example.l0902_anr;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button btn;
@Override
protected
阅读全文

AsyncTask使用解析和同步执行的问题

  categories:android  tags:  author:

Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。不过为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程。 AsyncTask 很早就出现在Android的API里了,所以我相信大多数朋友对它的用法都已经非常熟悉。不过今天我还是准备从AsyncTask的基本用法开始讲起, 然后我们再来一起分析下AsyncTask的并行执行情况

AsyncTask的基本用法

首先来看一下AsyncTask的基本用法,由于AsyncTask是一个抽象类,所以如果我们想使用它,就必须要创建一个子类去继承它。使用时需要继承这个类,然后调用execute()方法。注意继承时需要设定三个泛型Params,Progress和Result的类型,如AsyncTask<Void,Inetger,Void>:

  • Params是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型
  • Progress是指更新进度时传递的参数类型,即publishProgress()和onProgressUpdate()的参数类型
  • Result是指doInBackground()的返回值类型
上面的说明涉及到几个方法:
  • doInBackgound() 这个方法是继承AsyncTask必须要实现的,运行于后台,耗时的操作可以在这里做
  • publishProgress() 更新进度,给onProgressUpdate()传递进度参数
  • onProgressUpdate() 在publishProgress()调用完被调用,更新进度

布局文件如下:

<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:paddingLeft=”@dimen/activity_horizontal_margin”
android:paddingRight=”@dimen/activity_horizontal_margin”
android:paddingTop=”@dimen/activity_vertical_margin”
android:paddingBottom=”@dimen/activity_vertical_margin”
tools:context=”.MainActivity”>

<TextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”显示异步的执行情况” android:id=”@+id/tv_show”/>
<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”启动一个异步任务”
android:id=”@+id/bt_start_AsyncTask” android:layout_below=”@+id/tv_show” android:layout_alignLeft=”@+id/tv_show”

阅读全文

从0开始学编程(22)-android开发环境搭建与入门教程

  categories:0基础编程, 资料  tags:  author:

一. Android的钱景

参考2013年9月份的数据, Android生态中国市场份额达9成 追逐者争相涌现, 基本上是市场占有率最高的手机操作系统了, 它市场前景不用多说, 开发它的应用程序自然也非常有前景。

Android生态中国市场份额达9成 追逐者争相涌现

腾讯数码讯(苏扬)北京时间5月16日消息,谷歌Chrome和Android部门主管Sundar Pichai在I/O开发者大会的Keynote环节正式公布,全球Android设备激活总量达9亿的最新数据。而2012年全球Android设备的 激活量仅4亿,同比增长125%。而2011年,该数字刚刚突破1亿。两年时间一共增量高达8亿,对于Android操作系统而言,成绩斐然,同时这也意 味着Android作为世界第一大移动操作系统生态所言非虚。

相比在全球市场庞大的占有量,Android操作系统在发展中国家,尤其是新兴市场的占有量更是惊人。其中,中国市场的Android设备占移动手 持设备总量的9成,这不仅反映出了新兴智能手机市场的巨大潜力,也给其它非Android操作系统生态形成了巨大压力。相比之下,在已经高度成熟发展的北 美智能手机市场,iOS依旧是主力平台,而Android能否借力打力再下一城,全新的操作系统功能特征、更好的交互设计以及更优质的用户体验将成为其考 核新标准。与此同时,面对Windows Phone 8、BB10、Firefox OS等不同定位且针对不同用户群体操作系统的追赶,Android能否保持高速的领跑节奏和领先优势,同样值得商榷。

二. Android来源和历史

Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。
Android一词最早出现于法国作家利尔亚当(Auguste Villiers de l’Isle-Adam)在1886年发表的科幻小说《未来夏娃》(L’ève future)中。他将外表像人的机器起名为Android。
Android的Logo是由Ascender公司设计的,诞生于2010年,其设计灵感源于男女厕所门上的图形符号,[1] 于是布洛克绘制了一个简单的机器人,它的躯干就像锡罐的形状,头上还有两根天线,Android小机器人便诞生了。其中的文字使用了Ascender公司专门制作的称之为“Droid ” 的字体。Android是一个全身绿色的机器人,绿色也是Android的标志。颜色采用了PMS 376C和RGB中十六进制的#A4C639来绘制,这是Android操作系统的品牌象徵。有时候,它们还会使用纯文字的Logo。[1]
2012年7月美国科技博客网站BusinessInsider评选出二十一世纪十款最重要电子产品,Android操作系统和iPhone等榜上有名。

这么有钱景的一个系统, 自然有更多人学习了, 从网络上找一套比较好的 视频教程, 从中挑选了, 几个集初级入门的 视频, … 阅读全文

Android学习基本概念

  categories:android资料  tags:  author:

一 了解android

Android是非常流行的手机操作系统了, 现在android市场占有率在70%以上, 他的编程自然是一个很大的市场了。 最近也学习了一下android的编程知识,在网络上查找了很多文章, 找了很多资料, 把相关内容总结一下。

android的维基百科:http://zh.wikipedia.org/zh/Android

Android开发用的开发语言:
Java (学习Android之前最好有Java基础 android视频那个人出了一套android的java基础教程, 有时间我分享一下,我看了人家写的很好,值得学习和研究)

Android系统:
Android是基于Linux系统针对手机开发的系统

二 Android的大框架:

Android应用程序开发是基于组件的开发:
Android四大组件:

1. Activities

Activity之间的关系:
一个Activities代表一个单独和用户界面。

相当于windows中的窗口, 其实android程序同windows 的dot net下的 form窗体很像 ,一个程序由多少个窗体组成, 每个窗体内部有多个控件, 控件有消息, 窗体有消息。 各个窗体直接可以相互通讯。连ui线程是不安全都是一样。 仅仅是开发语言不一样了,换成java, 执行环境更换成linux了。
一个程序可以有多个Activity,不同程序里和同一个程序里的Activity可以通过Content Provider来交流(Intent就是Content下的一个类)

Activity的生命周期: — … 阅读全文

解决android studio Gradle警告GBK编码的不可映射字符的问题2

  categories:android  tags:  author:

前面用as开发android项目中, 遇到编码问题, 查找了各种办法, 但是没有好的解决
在前面的给出了一个比较不好的解决办法将编码转换成gbk然后进行编译
今天重新查找了些文章, 仔细阅读, 再三尝试, 终于可以把代码编译成utf8方式了,相关过程如下:

1. 编译项目后, 发现如下错误

android studio编译时出现的问题

android studio编译时出现的问题

2. 启动cmd窗口, 到dos下 ,用下面命令进行编译,获取编译的详细信息

gradlew compileDebug –stacktrace 1> a.log 2>&1

上面命令将编译的详细信息, 输出到a.log中, 然后查看日志文件

进入cmd(控制台)进行编译, 获取详细编译信息

进入cmd(控制台)进行编译, 获取详细编译信息

3. 查看日志文件,根据日志文件定位, 代码中那个代码有问题

 

查看android studio详细日志文件 查看android studio详细日志文件

 

查看今天的android studio编译错误

查看具体的android studio编译错误

4. … 阅读全文

Android Studio导入类库

  categories:android  tags:  author:

     最近实在是受够了Eclipse的速度,于是准备切换到Android Studio,这个开发环境对gradle有良好的支持,对于UI开发也更好,不过新的开发环境毕竟要适应一段时间,初次导入类库就遇到了麻烦。

对于jar的类库,非常简单,只要在项目根目录下新建一个libs目录,然后把jar复制进去,在jar上点击右键,选择Add as library,即可完成依赖的添加。

为了方便,录制了一段添加视频, 供参考:

链接: http://pan.baidu.com/s/1c0cYxpQ 密码: xns5

 

新建好了Android项目,添加一个第三方已经打包好的jar文件进你项目,下面就已添加一个ActiveAndroid-master的一个包

一。  粘贴第三方jar包, 如下图

粘贴要在android studio中导入的jar文件到libs中

粘贴要在android studio中导入的jar文件到libs中

直接通过COPY/PAST 把你下载的jar文件添加到libs文件夹下

二。 设置被粘贴的文件为库文件, 经过测试这个设置可以通知ide,系统中多了个jar, 然后在你需要导入类时, ide可以帮助你进行, 也可以进行编译检查。

在android studio中将粘贴进的文件设置为库

在android studio中将粘贴进的文件设置为库

然后在libs文件夹和添加的*.jar文件下鼠标单击菜单 add as library

三。 设置gradle的编译文件, 通过测试, 不设置这个文件, 程序没办法最后编译成功
在android studio中导入jar文件的关键一步设置build.gradle文件

在android studio中导入jar文件的关键一步设置build.gradle文件

打开App目录下有个build.gradle文件应该项目结构文件,上述的动作只是为了在在文件下添加

阅读全文

android studio中http访问网站的几种异常情况

  categories:android  tags:  author:

Android对HTTP(超文本传输协议)也提供了很好的支持,这里包括两种接口:

1、标准Java接口(java.net) —-HttpURLConnection,可以实现简单的基于URL请求、响应功能;

2、Apache接口(org.appache.http)—-HttpClient,使用起来更方面更强大。一般来说,用这种接口。

本文主要是探索几种http使用方式的不正确的情况,这些情况都会引起不正确的异常程序关闭

第一种情况: 在android的事件处理函数中,直接调用网络函数进行网络访问,这种情况,会直接导致android程序停止运行

第二种情况:在android的事件出来函数中,启动一个线程, 在线程中访问网络, 网络访问完成后, 将数据传递给android的界面中的临时变量, 但是这个情况下, 事件出来函数中不知道什么时候网络完成,因此例子里面用的是线程的join方法, 这个方法可以等待另外线程(网络访问)完成, 然后在事件处理函数进行数据的处理,这个的问题是, join时事件处理线程(UI)不能在响应其他请求,特别是网络线程中有网络异常例如连接超时,网络速度缓慢, 也有些情况下,在网络访问线程中有死锁或者sleep等类似操作等,都会造成事件处理函数的 等待,严重影响用户体验甚至不能工作

第三种情况: 在网络处理函数中直接将 获取到的数据设置到 android界面中, 这个情况下, 事件处理函数不用在等待了, 他直接启动线程就完成了。但是这个情况下,android程序会直接退出。android禁止在非 ui(非主线程)线程中 访问ui元素,界面控件等

本程序中网络方面采用HttpURLConnection进行http的访问, 相关HttpURLConnection情况如下, 具体代码见下面的链接。

HttpURLConnection继承自 URLConnection类,用它可以发送和接口任何类型和长度的数据,且预先不用知道数据流的长度,可以设置请求方式get或post、超时时间。

下面直接贴代码,代码目的有两个,一是访问百度首页,获取其返回的html字符串,二是给定URL下载个图片并显示出来。后续将展开系列博文介绍HTTP相关知识。

两个核心文件都略了, 稍后提供完整的源代码, 如下:

链接: http://pan.baidu.com/s/1nt5guxj 密码: dmp3… 阅读全文

Android–UI之ScrollView实例

  categories:android  tags:  author:

ScrollView和HorizontalScrollView是Android当中比较常用的两个布局容器,从字面意义上 来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是 一个水平方向的可以滚动的View。本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View。

一、ScrollView的简单介绍

首先来看看ScrollView和HorizontalScrollView这两个View的定义。ScrollView和 HorizontalScrollView都是一个布局容器,里面可以放入child View控件,我们通过其继承关系看到,ScrollView和HorizontalScrollView这两个类是ViewGroup的一个间接子类。

java.lang.Object   ↳    android.view.View        ↳    android.view.ViewGroup             ↳    android.widget.FrameLayout                  ↳    android.widget.ScrollView

java.lang.Object   ↳    android.view.View        ↳    android.view.ViewGroup             ↳    android.widget.FrameLayout                  ↳    android.widget.HorizontalScrollView

因为ScrollView和HorizontalScrollView只是两种滚动方向不同的View而已,其他方面都基本相同,所以下面只单单以ScrollView来讲解。

通过使用ScrollView,我们可以滚动其里面的子View控件,这样就允许我们控件的高度可以大于我们实际屏幕的尺寸高度。 ScrollView是一个FrameLayout,至于什么是FrameLayout,简单的来说,FrameLayout通常被用来设计成在屏幕上占 用一块地方并且里面只有一个Item,我们常用到的例如DatePicker、TimePicker这些控件都是属于FrameLayout布局的。因此 在ScrollView当中,也通常只包含一个子元素,并且这个子元素也是一个布局文件,这样我们才能在这个布局文件里面添加我们想要的任何子控件,从而 实现滚动的效果。

对于ScrollView来说,因为其是垂直方向上的滚动布局,因此通常我们给其添加一个LinearLayout的子元素,并且设置 orientation为vertical(垂直方向的)。下面我们通过一个小例子来看看如何使用我们的ScrollView来展示多张图片,并且实现图 片的垂直方向的滚动。

首先我们定义一个ScrollView,因为ScrollView也是一个ViewGroup,所以我们可以直接使用ScrollView作为我们的xml文件的根元素:

通过官方文档的继承关系可以看出,它继承自FrameLayout,所以它是一种特殊类型的FrameLayout,因为它可以使用用户滚动显示一个占据 的空间大于物理显示的视图列表。值得注意的是,ScrollView只能包含一个子视图或视图组,在实际项目中,通常包含的是一个垂直的 LinearLayout。

值得注意的是,ScrollView不能和ListView一起使用,因为ListView已经对垂直方向的滚动做了处理,它会迫使如果 ListView的内容大于物理视图的内容的时候,强制垂直滚动的效果,所以这里使用ScrollView和ListView混合使用是没有意义的, … 阅读全文

使用SharedPreferences实现android程序自动登录和记住密码

  categories:android  tags:  author:

在目前的android软件中, 经常是需要登录的, 但是登录过程是比较麻烦的, 特别是我们的密码, 设置简单不安全, 设置复杂输入不方便, 因此自动记住密码, 自动登录功能是比较必要的。

本文提供一种简单的自动登录, 记住密码的功能, 这个仅仅简单的方法, 更安全的方法可以继续在这个基础上进行相关加密来实现。

一.自动登录相关需求

1. 记住密码, 是帮助用户记住密码, 减少用户输入的过程, 但是这个情况下 用户还是要选择登录 按钮进行登录

程序仅仅在用户登录成功后, 并且勾选了记住密码的选项后才将用户密码保存起来。

2. 自动登录, 是根据自动记录的用户和密码, 自动帮助用户到服务器登录, 判断登录是否成功, 若是登录成功自动跳转到 后续工作流程

若是登录不成功, 显示登录页面, 用户继续输入用户名和密码, 然后在登录

程序在判断登录成功后, 并且选择了 自动登录后, 自动保存用户名和密码,然后设置自动登录标志位。

下一次再次进入登录界面时,自动读入自动登录标志和用户名及密码, 代替用户登录,若是登录成功, 则进行后续操作,否则显示登录页面,要求用户登录。… 阅读全文

Android Studio中文乱码的解决

  categories:android  tags:  author:

一. 在android的源文件中的乱码问题

Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框,具体的解决方法如下,

wps495c.tmp[5]_thumb[1]

可以肯定是字体的问题
解决:菜单File->settings对话框,切换到Appearance标签
wps495d.tmp[4]_thumb[1]
选择override default fonts by, 先随便选择一个中文字体(PS:小框框都是中文字 呵呵),保存,重启软件,即可。 

二. Toast.makeText乱码问题,如下

wps496e.tmp[4]_thumb[1]

文件中乱码解决了, 发现软件在工作中, Toast有乱码,在网络上查找了很多办法如下:

编辑项目工程里的build.grandle 文件中添加一段代码即可

wps498e.tmp[4]_thumb[1]

tasks.withType(Compile) {    options.encoding = “UTF-8″}apply plugin: ‘android’android {}

也可以是:

tasks.withType(Compile) {
options.encoding = “UTF-8″
}

用最新的插件,有个配置参数0.6.+ 以后支持
android {
compileOptions.encoding = … 阅读全文



快乐成长 每天进步一点点