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”

阅读全文

解决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 studio Gradle警告GBK编码的不可映射字符的问题

  categories:android  author:

今天用android studio来写代码,然后在代码中加了中文注释导致无法编译:提示错误:“ Gradle: 警告:编码 GBK 的不可映射字符”。

网络上 查找各种解决方法, 也没有最终解决, 可以通过到cmd中进行编译, 找到错误的代码行, 可以进行删除相关注释,一般都能解决,但是不是最好的办法。

下面是从网络上搜索的解决方法,如下(其实我的程序这么操作后,也没有解决, 我是用下面的另外方法进行的解决)
网上也有挺多解决的方法,但是看得不是很明显,这里截图给大家分享一下:

这里是中文代码注释

android studio代码中的 中文注释,容易引起编译问题,程序没办法启动

android studio代码中的 中文注释,容易引起编译问题,程序没办法启动

编译出错,在项目下的build.gradle下添加以下代码即可解决。

复制代码

 

在图中代码中添加相关设置可以解决android studio中文编码问题

在图中代码中添加相关设置可以解决android studio中文编码问题

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

截图看起来更加清晰哈.

设置android studio的编码方式为utf-8

设置android studio的编码方式为utf-8

 

参照上面的过程进行了设置, 但是在我的项目中, 问题还是存在,后来采用源代码转换成gbk的方式,问题解决,过程如下:

1. 选择源代码文件, 选择其中文件编码… 阅读全文

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

Android Studio新建Activity

  categories:android  tags:  author:

 

Android Studio是在google I/O大会上新发布的一个IDE,基于IntelliJ,Android开发除了Eclipse之外又多了一种选择。

在Android Studio中如何在当前项目中添加一个Activity?

1. 右键点Java包名, new — Android Component

wpsf2c6.tmp_thumb[1][1]
显示如下:

wpsf2e6.tmp_thumb[1][1]

创建如下类

wpsf2f7.tmp_thumb[1][1]

同时在xml文件中添加了如下内容

wpsf307.tmp_thumb[1][1]

2. 创建布局文件

不过这只是创建了java代码,还没有给这个activity创建layout。在res->layout上点右键, 选 New Layout resource file,输入layout 名字和需要的布局,Android Studio 会帮你创建layout并且切换到可见即所得视图进行界面设计:

wpsf308.tmp_thumb[1][1]

如下:

wpsf309.tmp_thumb[1][1]

创建完成如下:

wpsf31a.tmp_thumb[1][1]

为了让上面创建的这个layout资源,还需要在onCreate里加一句setContentView,如下:

public class aa extends Activity {

    public void onCreate(Bundle savedInstanceState) … 阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1