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
阅读全文

Material Design的一次设计探索

  categories:android资料  author:

原文出处: Arthur Bodolec 译文出处:阿里UED – 郭楠

【译者注】作为一个移动界面设计师,如果你已经细细读过Material Design的设计指引,那么这篇文章是一篇很好的设计案例。如果你还没有读过,那这篇文章一定是个最容易最生动的起点,以小窥大得帮助你进入Material Design的世界。 大家知道,google最近发布了Android的Lollipop系统,系统的一个重大改动是引入了一种新的视觉语言:Material Design。随着新系统的发布,安卓也发布了一个跨平台的视觉、动效、交互设计的全面指引。10月7日,Google的Material Design体验团队组织了一个workshop,跟第三方app团队分享了一些设计见解和小技巧,来指导他们在Android平台的设计。

在我看来,Android的这次改进,是在对的方向上又迈进了实实在在的一步。这个新系统目前已经拥有足够的一致性和灵活性,足以兼容任何新app 的设计。所以呢,我在回来之后也重新回到我feedly的设计稿,尝试将feedly的界面根据Material Design的设计指引,做一次重新设计的尝试。

这次尝试,我的主要目的是创造一个完全根据Google的Material Design原则优化的全新版本。这个版本可以指引设计团队的未来设计。同时,我们还可以选用其中的一些设计点,立即落地并发布在以后的版本中。这次尝试 的第二个目的,是为feedly获得一些用户反馈。所以如果你有任何建议,请留下些评论。

这篇文章里,不仅有这次重新设计的结果,也讲述了过程中的设计思考。

好了,进入正题,让我们马上开始Material Design的探索。 总览 在这次重新设计中,我着重设计feedly的几个主要界面。下图是设计前(上排)和设计后(下排)的对比图。 Material Design的设计指引要是全面描述的话,会太繁杂。所以在这里我提取出四个核心设计要点,这四个核心要点也是我用来重新设计的主要依据。 一、有形的界面(Tangible Interfaces) Material Design 设计原则

“在material design中,app里的每个像素都被呈现在一张纸(a sheet of paper)上。这张纸有单一的背景颜色,并且根据不同的环境可以被随意缩放。一个典型的界面排版,可能由好几张不同大小的纸张的重叠构成。”

设计原则在feedly的运用 Feedly原有的界面已经在运用类似的纸张隐喻,我们的主要设计元素是一叠叠的卡片,每个卡片上都有文章列表或文章。上滑卡片,下一张卡片就会被显示出来。这种隐喻正好和Material Design可以完美契合。

Feedly的导航位于左侧的面板上,面板可以被滑出,盖在那叠卡片上。Feedly的“发现”界面也是同样逻辑,只是位于右侧。 … 阅读全文

Android杂谈–LayoutInflater和MenuInflater用法

  categories:android资料  author:

来源:http://www.cnblogs.com/loulijun/archive/2011/12/28/2305452.html

前言

LayoutInflater用法

LayoutInflater是一个用来实例化XML布局为View对象

应用程序运行时会预先加载资源中的布局文件,如果layout布局中的资源比较多,会影响性能,所以可以选择LayoutInflater方式用的时候加载,这样减轻了应用程序运行时很多负担

public View inflate (int resource, ViewGroup root)

从指定的XML资源中填充一个新的视图

参数resource:将要加载的XML布局id,例如R.layout.list_item

参数root:父视图,可选项,一般为Null

public static LayoutInflater from (Context context)

从给定的context获取LayoutInflater

可以通过如下三种方式获取LayoutInflater

第一种:

        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View myView = inflater.inflate(R.layout.main, null);

第二种:与第一种方法相同,即from方法封装了getSystemService(…)等

        LayoutInflater inflater = LayoutInflater.from(context);
        View 
阅读全文

android的ADT-Bundle环境快速创建

  categories:android资料  author:

正文:

ADT-Bundle for Windows 是由Google Android官方提供的集成式IDE,已经包含了Eclipse,你无需再去下载Eclipse,并且里面已集成了插件,它解决了大部分新手通过eclipse来配置Android开发环境的复杂问题。

有了ADT-Bundle,新涉足安卓开发的同学也无需再像以前那样在网上参考繁琐的配置教程,可以轻松一步到位进行Android应用开发。

第一步:JAVA SDK(JDK)的安装:

可以去问百度下载JDK,也可以到官方下载JDK。

官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html

这个更快捷: http://pan.baidu.com/s/1qWpw4EC

 

第二步: 下载ADT-Bundle for Windows

官方下载地址:http://developer.android.com/sdk/index.html 这个地址非常慢, 建议考虑下面的地址

http://tools.android-studio.org/ 这个里面有非常多的 重要的android资源下载

如果您要 安装windows版本, 可以直接使用如下地址

http://pan.baidu.com/s/1nt0XUI1

 

第三步:安装ADT-Bundle

直接把下载下来的的adt-bundle-windows-xxx-xxx.zip,解压到你需要安装的位置。

 

第四步:安装Android SDK

打开解压出来的文件夹里面的 SDK Manager.exe (也可以运行eclipse/eclipse.exe 然后通过Windows … 阅读全文

Android官方图片加载利器BitmapFun解析

  categories:android资料  author:
来源:http://www.cnblogs.com/purediy/p/3462822.html

通过BitmapFun在项目中使用,结合代码了解一下BitmapFun加载图片的原理,以及最佳使用实践。本文说明不包括BitmapFun的缓存部分。

Android开发在使用ListView和 GridView时,可能会有很多网络图片需要加载,通常我们会为每个图片加载启动一个Thread或者直接使用官方提供的AsyncTask,来做 Http异步加载,但当每个ImageView子视图都触发一个AsyncTask来异步加载图片时,这样就会产生如下问题:

1. 当用户快速滑动时,ImageView已经被回收,而绑定的线程还在运行,浪费CPU,浪费内存。

2. 无法确保当前视图在结束时,分配的视图已经进入循环队列中给另外一个子视图进行重用,意思就是,图片显示错位了,不该显示到当前问题的图片却显示了,这个 是经常遇到的问题。可以结合Adapter中的getView方法的convertView参数理解,ListView是回收和重复利用item的。

3. 无法确保所有的异步任务能够按顺序执行。

在这些问题下,官网给出的答案是,使用下面的方法来保证:

1. ImageView和Task绑定准确的加载对应图片;

2. ImageView和Task无法对应时则取消任务;

BitmapFun实现多线程并发加载图片的原理:

一个类,两个方法:

class AsyncDrawable extends BitmapDrawable{…}

boolean cancelPotentialWork(String url, ImageView imageView){…}

ImageViewResizeTask getBitmapWorkerTask(ImageView imageView){…}

具体代码实现如下:

/**
* 扩展BitmapDrawable类,通过弱引用关联任务BitmapWorkerTask
* BitmapDrawable被用来作为占位图片,绑定任务到ImageView中
*/
private class

阅读全文

如何使用Android MediaStore裁剪大图片

  categories:android资料  author:

来源:http://blog.csdn.net/floodingfire/article/details/8144587

译者:Ryan Hoo

来源:http://www.androidworks.com/crop_large_photos_with_android

译者按:在外企工作的半年多中花了不少时间在国外的网站上搜寻资料,其中有一些相当有含金量的文章,我会陆陆续续翻译成中文,与大家共享之。初次翻译,“信达雅”三境界恐怕只到信的层次,望大家见谅!

这篇文章相当经典而实用,想当初我做手机拍照截图的时候,大多都是在网上抄来抄去的内容,从来没有人考虑过实际项目中的需求。实际上,拍照传大图片,如果 用普通方式会耗用极大的内存,Android一个App原则上的16M内存限制可以一下子被耗光。Android在拍照上有一个隐藏的设计,如果拍照图片 过大,只返回一张缩略图。具体到不同手机,都是不一样的。

译文:

概述
我写这篇文章是为了发表我对MediaStore裁剪图片功能的一些简要研究。基本上,如果你要写一个应用程序,使用已有的Media Gallery并允许用户在你的应用里选取TA的图片的一部分(可选功能:人脸识别)。 可以使用一个Intent做到这个,但是也存在着相应的问题,总的来说也缺少这方面的文档告诉我们怎么实现它。 另外,这篇文章基于2.1并且在Nexus One上做了测试。 Nexus One上的实现似乎被这群人写在了这里: Media Gellery for Nexus One 。

反馈

这篇文章需要使用基于我的研究所写的程序。如果你对我推荐的实现方案有所改进,请让我知道。我会相应的更新这篇文章。

Intent细节
首先,让我们探讨下Intent以及它的特点。在看了一些代码示例以后,我发现我可以很轻松的使用如下的Intent调用裁剪功能:
Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType(“image/*”);
intent.putExtra(“crop”, “true”);

然而,这是在我缺少附加的文档,不知道这些选项的具体含义等等情况之下的选择。所以,我将我的yanj整理成一个表格 ,并写了一个演示程序,力图演示控制此功能的所有可供选项。
你可以在你的程序中使用使用我的代码,并且扩展它。我会将之附加在这篇文章上。… 阅读全文

Android横竖屏切换总结

  categories:android资料  author:

Android横竖屏要解决的问题应该就两个:

一.布局问题

二.重新载入问题

1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:

“unspecified”:默认值 由系统来判断显示方向.判定的策略是和设备相关的,所以不同的设备会有不同的显示方向.
“landscape”:横屏显示(宽比高要长)
“portrait”:竖屏显示(高比宽要长)
“user”:用户当前首选的方向
“behind”:和该Activity下面的那个Activity的方向一致(在Activity堆栈中的)
“sensor”:有物理的感应器来决定。如果用户旋转设备这屏幕会横竖屏切换。
“nosensor”:忽略物理感应器,这样就不会随着用户旋转设备而更改了(”unspecified”设置除外)。

也可以在Java代码中通过setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)来设置。

如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同的布局。可以通过以下方法来切换布局:

1)在res目录下建立layout-land和layout-port目录,相应的layout文件不变,比如main.xml。layout-land是横屏的layout,layout-port是竖屏的layout,其他的不用管,模拟器会自动寻找。
2) 通过 this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏然后来加载相应的 xml布局文件。因为当屏幕变为横屏的时候,系统会重新呼叫当前Activity的onCreate方法,你可以把以下方法放在你的onCreate中来 检查当前的方向,然后可以让你的setContentView来载入不同的layout xml.
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
Log.i(“info”,”landscape”); // 横屏
}
else if(this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_PORTRAIT) {
Log.i(“info”,”portrait”); // 竖屏
}
在onConfigurationChanged()方法中也可以检测拥有硬键盘的键盘状态
//检测实体键盘的状态:推出或者合上   … 阅读全文

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的Application对象里存储数据

  categories:android资料  author:

在一个App里面总有一些数据需要在多个地方用到。这些数据可能是一个 session token,一次费时计算的结果等。通常为了避免activity之间传递对象的开销 ,这些数据一般都会保存到持久化存储里面。

有人建议将这些数据保存到 Application 对象里面,这样这些数据对所有应用内的activities可用。这种方法简单,优雅而且……完全扯淡。

假设把你的数据都保存到Application对象里面去了,那么你的应用最后会以一个NullPointerException 异常crash掉。

一个简单的测试案例

代码

Application 对象:

// access modifiers omitted for brevity
class MyApplication extends Application {

String name;

String getName() {
return name;… 阅读全文

Android performClick无效,UI线程理解

  categories:android资料  author:

来源:http://www.cnblogs.com/purediy/p/3435933.html

原因

开发过程中遇到button.performClick()无效,原因是View.performClick()需要再UI线程中调用才会有效执行。

响应系统调用的方法(比如报告用户动作的onKeyDown()或一个生命周期回调方法)永远在界面线程中进程,所以onCreate里面调用button的performClick没问题,
而通过code直接调用相当于是代码执行,并不会触发android的UI线程。

什么是UI线程,以下来自官网翻译

当一个应用被启动,系统创建一个执行线程,叫做”main”。这个线程是十分重 要的,因为它主管向用户界面控件派发事件。其中包含绘图事件。它也是你的应用与界面工具包(android.widget和 android.view包中的组件)交互的地方。于是main线程也被称为界面线程。

系统不会为每个组件的实例分别创建线程。所有运行于一个进程的组件都在界面线程中被实例化,并且系统对每个组件的调用都在这个线程中派发。因此,响应系统调用的方法(比如报告用户动作的onKeyDown()或一个生命周期回调方法)永远在界面线程中进程。

例如,当用户触摸屏幕上的一个按钮时,你的应用的界面线程把触摸事件派发给控件,然后控件设置它的按下状态再向事件队列发出一个自己界面变得无效的请求,界面线程从队列中取出这个请求并通知这个控件重绘它自己。

http://wiki.eoeandroid.com/Processes_and_Threads

解决方法,最简单的方式

1
2
3
4
5
6
View.post(new Runnable(){
    @Override
    public void run() {
        button.performClick();
    }
});

View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里, 它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在 Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线 程里,因此,我们可以毫无顾虑的来更新UI。

1
2
3
4
5
阅读全文


快乐成长 每天进步一点点