posts - 89,  comments - 2,  trackbacks - 0
  2015年7月13日
package com.zhihe.xqsh.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.params.ConnManagerParams;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.util.EntityUtils;

import com.zhihe.xqsh.network.ServerErrorException;

import android.accounts.NetworkErrorException;
import android.annotation.SuppressLint;
import android.util.Log;


public class CustomerHttpClient {
private static final String TAG = CustomerHttpClient.class.getSimpleName();

private static DefaultHttpClient customerHttpClient;

private CustomerHttpClient() {
}

public static synchronized HttpClient getHttpClient() {
if (null == customerHttpClient) {
HttpParams params = new BasicHttpParams();
// 设置�?��基本参数
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, "UTF-8");
HttpProtocolParams.setUseExpectContinue(params, true);
HttpProtocolParams.setUserAgent(params, "Mozilla/5.0(Linux;U;Android 2.2.1;en-us;Nexus One Build.FRG83) "
+ "AppleWebKit/553.1(KHTML,like Gecko) Version/4.0 Mobile Safari/533.1");
// 超时设置
/* 从连接池中取连接的超时时�?*/
ConnManagerParams.setTimeout(params, 2000);
ConnManagerParams.setMaxTotalConnections(params, 800);
/* 连接超时 */
HttpConnectionParams.setConnectionTimeout(params, 5000);
/* 请求超时 */
HttpConnectionParams.setSoTimeout(params, 10000);

// 设置我们的HttpClient支持HTTP和HTTPS两种模式
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));

// 使用线程安全的连接管理来创建HttpClient
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
// �?��连接数:ConnManagerParams.setMaxTotalConnections(params, 50);
customerHttpClient = new DefaultHttpClient(conMgr, params);
}
return customerHttpClient;
}

/**
* 以get方式提交数据
* @param url 提交地址
* @param params 参数
* @return 响应结果
* @throws ServerErrorException 请求失败
* @throws NetworkErrorException 连接失败
*/
public static String get(String url, String params) throws ServerErrorException, NetworkErrorException {
int tryTimes = 0;
NullPointerException ex;
do {
try {
return tryGet(url, params);
} catch (NullPointerException e) {
ex = e;
tryTimes++;
}
} while (tryTimes < 3);
throw ex;
}

/**
* 以get方式提交数据
* @param url 提交地址
* @param params 参数
* @return 响应结果
* @throws ServerErrorException 请求失败
* @throws NetworkErrorException 连接失败
*/
public static String tryGet(String url, String params) throws ServerErrorException, NetworkErrorException {
try {
HttpGet request = new HttpGet(url + params);

/*if (LotteryApplication.isCmwap()) {
org.apache.http.HttpHost proxy = new org.apache.http.HttpHost("10.0.0.172", 80, "http");
HttpParams httpParams = new BasicHttpParams();
ConnRouteParams.setDefaultProxy(httpParams, proxy);
request.setParams(httpParams);
}*/

HttpClient client = getHttpClient();
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new ServerErrorException("��������æ�����Ժ�����");
}
HttpEntity resEntity = response.getEntity();
String result = (resEntity == null) ? null : EntityUtils.toString(resEntity, "UTF-8");
return result;
} catch (UnsupportedEncodingException e) {
logw(e.getMessage());
return null;
} catch (ClientProtocolException e) {
logw(e.getMessage());
return null;
} catch (IOException e) {
throw new NetworkErrorException("���Ӳ��ɹ���������������", e);
}
}

private static void logw(String string) {
if (string != null) {
Log.w(TAG, string);
}
}

/**
* 以post方式提交数据
* @param url 提交地址
* @param params 参数
* @return 响应结果
* @throws ServerErrorException 请求失败
* @throws NetworkErrorException 连接失败
*/
public static String post(String url, List<NameValuePair> params) throws ServerErrorException, NetworkErrorException {
return post(url, params, null);
}

/**
* 以post方式提交数据
* @param url 提交地址
* @param params 参数
* @param soTimeout 响应超时时间,单位毫�?
* @return 响应结果
* @throws ServerErrorException 请求失败
* @throws NetworkErrorException 连接失败
*/
public static String post(String url, List<NameValuePair> params, int soTimeout) throws ServerErrorException,
NetworkErrorException {
HttpParams httpParams;
if (soTimeout <= 0) {
httpParams = null;
} else {
httpParams = new BasicHttpParams();
HttpConnectionParams.setSoTimeout(httpParams, soTimeout);
}
return post(url, params, httpParams);
}

/**
* 以post方式提交数据
* @param url 提交地址
* @param params 参数
* @param httpParams http参数
* @return 响应结果
* @throws ServerErrorException 请求失败
* @throws NetworkErrorException 连接失败
*/
public static String post(String url, List<NameValuePair> params, HttpParams httpParams) throws ServerErrorException,
NetworkErrorException {
int tryTimes = 0;
NullPointerException ex;
do {
try {
return tryPost(url, params, httpParams);
} catch (NullPointerException e) {
ex = e;
tryTimes++;
}
} while (tryTimes < 3);
throw ex;
}

/**
* 以post方式提交数据
* @param url 提交地址
* @param params 参数
* @param httpParams http参数
* @return 响应结果
* @throws ServerErrorException 请求失败
* @throws NetworkErrorException 连接失败
*/
public static String tryPost(String url, List<NameValuePair> params, HttpParams httpParams) throws ServerErrorException,
NetworkErrorException {
try {
HttpPost request = new HttpPost(url);
if (params != null && params.size() > 0) {
request.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
}

// if (LotteryApplication.isCmwap()) {
// org.apache.http.HttpHost proxy = new org.apache.http.HttpHost("10.0.0.172", 80, "http");
// if (httpParams == null)
// httpParams = new BasicHttpParams();
// ConnRouteParams.setDefaultProxy(httpParams, proxy);
// }

if (httpParams != null)
request.setParams(httpParams);
//Log.v("CS", params.toString());
HttpClient client = getHttpClient();
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
//Log.v("CS", params.toString());
//Log.v("CS", response.getStatusLine().getStatusCode() + "");
request.abort(); 
throw new ServerErrorException("��������æ�����Ժ�����");
}
if (response.getStatusLine ().getStatusCode () != 200) {  
request.abort();  //�ж�����,���������Կ�ʼ��һ������
                return null;  
            } 
HttpEntity resEntity = response.getEntity();
String result = (resEntity == null) ? null : EntityUtils.toString(resEntity, "UTF-8");
//Log.v("CS", params.toString() + "||||" + result);
return result;
} catch (UnsupportedEncodingException e) {
logw(e.getMessage());
return null;
} catch (ClientProtocolException e) {
logw(e.getMessage());
return null;
} catch (IOException e) {
throw new NetworkErrorException(e.getMessage(), e);
//throw new NetworkErrorException("连接不成功,请检查网络设�?, e);
}
}

@SuppressLint("SdCardPath")
public static String download(String url) throws ServerErrorException, NetworkErrorException {
try {
//Log.i("http-download", url);
HttpPost request = new HttpPost(url);
HttpClient client = getHttpClient();
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new ServerErrorException("��������æ�����Ժ�����");
}

HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
if (is == null)
throw new ServerErrorException("stream is null ");

String fileExt = url.substring(url.lastIndexOf(".") + 1, url.length()).toLowerCase();
String fileName = url.substring(url.lastIndexOf("/") + 1, url.lastIndexOf("."));

File tempFile = new File("/sdcard/" + fileName + "." + fileExt);
if (!tempFile.exists())
tempFile.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);

byte[] buf = new byte[1024];
int ch;
while ((ch = is.read(buf)) != -1) {
fileOutputStream.write(buf, 0, ch);
}

fileOutputStream.flush();
fileOutputStream.close();
return tempFile.getAbsolutePath();
} catch (UnsupportedEncodingException e) {
logw(e.getMessage());
return null;
} catch (ClientProtocolException e) {
logw(e.getMessage());
return null;
} catch (IOException e) {
throw new NetworkErrorException(e.getMessage(), e);
}
}

/**
* 清空cookie
*/
public static void clearCookie() {
if (customerHttpClient != null)
customerHttpClient.getCookieStore().clear();
}

/**
* 清除指定cookie
* @param name cookie名称
*/
public static void clearCookie(String name) {
if (customerHttpClient == null)
return;

BasicClientCookie expiredCookie = new BasicClientCookie(name, "null");
expiredCookie.setExpiryDate(new Date(System.currentTimeMillis() - 1000));
customerHttpClient.getCookieStore().addCookie(expiredCookie);
}
}
posted @ 2015-07-13 22:10 Terry Zou 阅读(116) | 评论 (0)编辑 收藏
ffg
http://yunpan.cn/ccdbTgQaYa4U7
posted @ 2015-07-13 11:04 Terry Zou 阅读(51) | 评论 (0)编辑 收藏
  2015年7月9日
abe
private Drawable img_time_filter,img_time_filter_selected ;
//过滤器TextView中显示的图片
img_time_filter = getResources().getDrawable(R.drawable.time_filter);
//调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示
img_time_filter.setBounds(0, 0, img_time_filter.getMinimumWidth(), img_time_filter.getMinimumHeight());
img_time_filter_selected = getResources().getDrawable(R.drawable.time_filter_selected);
img_time_filter_selected.setBounds(0, 0, img_time_filter_selected.getMinimumWidth(), img_time_filter_selected.getMinimumHeight());
tv_filterTime.setCompoundDrawables(img_time_filter_selected, null, null, null);
tv_filterTime.setTextColor(getResources().getColor(R.color.white));
rl_filterTime.setBackgroundColor(getResources().getColor(R.color.red));

tv_filterTime.setCompoundDrawables(img_time_filter, null, null, null);
rl_filterTime.setBackgroundColor(getResources().getColor(R.color.white)); 
lv_filterTime.setVisibility(View.INVISIBLE);
posted @ 2015-07-09 00:04 Terry Zou 阅读(91) | 评论 (0)编辑 收藏
  2015年7月8日
abd
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical" >
    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView_routePlanActivity"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="@drawable/common_title_back"
        android:gravity="center"
        android:padding="5dp" >
        <Button
            android:id="@+id/button_transit_routePlan"
            android:layout_width="0dp"
            android:drawableLeft="@drawable/ic_bus"
            android:padding="5dp"
            android:background="@drawable/selector_white_gray"
            android:layout_height="50dp"
            android:layout_weight="1.0"
            android:onClick="SearchButtonProcess"
            android:text="公交" />
        <Button
            android:id="@+id/button_drive_routePlan"
            android:layout_width="0dp"
             android:drawableLeft="@drawable/ic_drive"
            android:layout_height="50dp"
            android:layout_weight="1.0"
            android:padding="5dp"
            android:background="@drawable/selector_white_gray"
            android:onClick="SearchButtonProcess"
            android:text="驾车" />
        <Button
            android:id="@+id/button_walk_routePlan"
            android:layout_width="0dp"
            android:layout_height="50dp"
             android:drawableLeft="@drawable/ic_walk"
            android:layout_weight="1.0"
            android:padding="5dp"
            android:background="@drawable/selector_white_gray"
            android:onClick="SearchButtonProcess"
            android:text="步行" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/linearLayout_node_routePlan"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="10dip"
        android:visibility="gone"
        android:gravity="bottom|center_horizontal" >
        <Button
            android:id="@+id/button_pre_routePlan"
            android:layout_width="60dp"
            android:layout_height="30dp"
            android:layout_marginRight="2dip"
            android:background="@drawable/pre_"
            android:onClick="nodeClick" />
        <Button
            android:id="@+id/button_next_routePlan"
            android:layout_width="60dp"
            android:layout_height="30dp"
            android:layout_marginLeft="2dip"
            android:background="@drawable/next_"
            android:onClick="nodeClick" />
    </LinearLayout>
</FrameLayout>
posted @ 2015-07-08 23:57 Terry Zou| 编辑 收藏
abc
<LinearLayout
           android:id="@+id/estate_linear"
           android:layout_width="fill_parent"
           android:layout_height="35dp"
           android:layout_weight="1"
           android:background="@drawable/border_rounded_gray_white"
           android:layout_gravity="center_vertical"
           android:gravity="center_vertical"
           android:layout_margin="5dp"
           android:orientation="horizontal" >
<ImageButton
           android:id="@+id/object_btn_search"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_marginLeft="8dp"
           android:layout_gravity="center_vertical|right"
           android:background="@drawable/btn_search"
           android:contentDescription="@null"
           android:scaleType="fitXY" />
<RelativeLayout
            android:layout_width="1dp"
            android:layout_height="33dp"
            android:layout_marginLeft="8dp"
            android:background="@color/color_line" />
            <EditText
                 android:id="@+id/object_et_content"
                 style="@style/StringSearchText"
                 android:layout_gravity="left|center_vertical"
                 android:layout_marginLeft="2dp"
                 android:layout_marginRight="8dp"
                 android:layout_weight="1"
                 android:background="@null"
                 android:hint="@string/tip_search_hint"
                 android:imeOptions="actionSend"
                 android:singleLine="true"
                 android:textCursorDrawable="@null"
                 android:textColorHint="#626463" />
            <ImageButton
                 android:id="@+id/object_btn_del"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="right|center_vertical"
                 android:layout_marginRight="10dp"
                 android:background="@drawable/ic_clear" />
         </LinearLayout>


border_rounded_gray_white.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 连框颜色值 -->
    <item>
        <shape>
            <solid android:color="@color/bg_gray" />
            <corners
                android:bottomLeftRadius="3dp"
                android:bottomRightRadius="3dp"
                android:topLeftRadius="3dp"
                android:topRightRadius="3dp" />
        </shape>
    </item>
    <!-- 主体背景颜色值 -->
    <item
        android:bottom="1dp"
        android:left="1dp"
        android:right="1dp"
        android:top="1dp">
        <shape>
            <solid android:color="@color/white" />
            <corners
                android:bottomLeftRadius="3dp"
                android:bottomRightRadius="3dp"
                android:topLeftRadius="3dp"
                android:topRightRadius="3dp" />
        </shape>
    </item>
</layer-list>

<style name="StringSearchText">
        <item name="android:textSize">14dp</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:textColor">@android:color/black</item>
    </style>

btn_search.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 没有焦点时的背景图片 -->
    <item android:drawable="@drawable/ic_search_normal" android:state_window_focused="false"/>
    <!-- 非触摸模式下获得焦点并单击时的背景图片 -->
    <item android:drawable="@drawable/ic_search_pressed" android:state_focused="true" android:state_pressed="true"/>
    <!-- 触摸模式下单击时的背景图片 -->
    <item android:drawable="@drawable/ic_search_pressed" android:state_focused="false" android:state_pressed="true"/>
    <!-- 选中时的图片背景 -->
    <item android:drawable="@drawable/ic_search_pressed" android:state_selected="true"/>
    <!-- 获得焦点时的图片背景 -->
    <item android:drawable="@drawable/ic_search_pressed" android:state_focused="true"/>
    <!-- 默认图片背景 -->
    <item android:drawable="@drawable/ic_search_normal"/>
</selector>

<color name="color_line">#bebebe</color>



private TextWatcher textWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
}
@Override
public void afterTextChanged(Editable s) {
mKeywords = tv_keyword.getText().toString();
AgUtils.log(TAG+"mKeywords:"+mKeywords, 4);
if (TextUtils.isEmpty(mKeywords)) {
object_btn_del.setVisibility(View.GONE);
} else {
object_btn_del.setVisibility(View.VISIBLE);
searchIndexListInfo();
}
}
};

tv_keyword.addTextChangedListener(textWatcher);
posted @ 2015-07-08 23:55 Terry Zou| 编辑 收藏
  2015年6月24日

转载:http://www.cnblogs.com/allenzheng/archive/2013/04/28/3050065.html
当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在
AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置

 

1. Standared模式(默认)

我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。

 

2. SingleTop模式

这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。

 

3. SingleTask模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。

 

4. SingleInstance模式

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity

posted @ 2015-06-24 18:10 Terry Zou 阅读(352) | 评论 (0)编辑 收藏
     摘要: android中跨进程通讯的4种方式 转自:http://www.cnblogs.com/sevenyuan/archive/2013/03/22/2975122.html由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用...  阅读全文
posted @ 2015-06-24 17:28 Terry Zou 阅读(375) | 评论 (0)编辑 收藏

Android 手机上的应用一般情况下都在一个进程中运行。

但是,也可以指定Activity或者Service在Remote 进程中执行。多数情况下,只有在用户认为应用退出后还需要继续后台长期运行的应用,才需要这样做。此时,该应用有两个进程。

还有一种hack的方式,在apk中通过调用命令行来启动另外的进程。此种方式用户不可见,也不安全。不提倡。

posted @ 2015-06-24 17:12 Terry Zou 阅读(213) | 评论 (0)编辑 收藏

官网帮助文档链接:
 http://developer.android.com/guide/components/fragments.html

主要看两张图,和跑代码

一,Fragment的生命周 

          

二,与Activity生命周期的对比

     

场景演示 : 切换到该Fragment

11-29 14:26:35.095: D/AppListFragment(7649): onAttach
11-29 14:26:35.095: D/AppListFragment(7649): onCreate
11-29 14:26:35.095: D/AppListFragment(7649): onCreateView
11-29 14:26:35.100: D/AppListFragment(7649): onActivityCreated
11-29 14:26:35.120: D/AppListFragment(7649): onStart
11-29 14:26:35.120: D/AppListFragment(7649): onResume

屏幕灭掉:

11-29 14:27:35.185: D/AppListFragment(7649): onPause
11-29 14:27:35.205: D/AppListFragment(7649): onSaveInstanceState
11-29 14:27:35.205: D/AppListFragment(7649): onStop


屏幕解锁

11-29 14:33:13.240: D/AppListFragment(7649): onStart
11-29 14:33:13.275: D/AppListFragment(7649): onResume


切换到其他Fragment:
11-29 14:33:33.655: D/AppListFragment(7649): onPause
11-29 14:33:33.655: D/AppListFragment(7649): onStop
11-29 14:33:33.660: D/AppListFragment(7649): onDestroyView


切换回本身的Fragment:

11-29 14:33:55.820: D/AppListFragment(7649): onCreateView
11-29 14:33:55.825: D/AppListFragment(7649): onActivityCreated
11-29 14:33:55.825: D/AppListFragment(7649): onStart
11-29 14:33:55.825: D/AppListFragment(7649): onResume

回到桌面

11-29 14:34:26.590: D/AppListFragment(7649): onPause
11-29 14:34:26.880: D/AppListFragment(7649): onSaveInstanceState
11-29 14:34:26.880: D/AppListFragment(7649): onStop

回到应用

11-29 14:36:51.940: D/AppListFragment(7649): onStart
11-29 14:36:51.940: D/AppListFragment(7649): onResume


退出应用

11-29 14:37:03.020: D/AppListFragment(7649): onPause
11-29 14:37:03.155: D/AppListFragment(7649): onStop
11-29 14:37:03.155: D/AppListFragment(7649): onDestroyView
11-29 14:37:03.165: D/AppListFragment(7649): onDestroy
11-29 14:37:03.165: D/AppListFragment(7649): onDetach


比Activity多了一些生命周期,完整和Activity对接上,大家好好利用。

转载:http://blog.csdn.net/forever_crying/article/details/8238863/

posted @ 2015-06-24 16:05 Terry Zou 阅读(341) | 评论 (0)编辑 收藏
ANR(Application Not Responding)
    ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应对话框(ANR:Application Not Responding),用户可以选择“等待”让应用程序继续运行,也可以选择“强制关闭”。所以一个顺畅合理的应用程序不会出现ANR,而让用户处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。
    默认情况下,Android的Activity执行时间为5s,BroadcastReceiver的最长执行时间为10s.
    第一,什么会引发ANR
    在Android里,应用程序响应由Activity Manager和WindowManager系统服务监视的,当它监听到一下一种情况时,Android就会针对特定的应用程序显示ANR:
    1).在5秒内没有响应输入事件(例如,按键按下,屏幕触摸)
    2).BroadcastReceiver在10秒内没有执行完毕
    造成以上两点多原因有很多,比如在主线程中做非常耗时的操作,比如下载,IO异常等。

    潜在的耗时操作,例如网络或数据库操作或者高耗时的计算如改变位图尺寸,这些操作应该放在子线程中(或者以数据库为例,通过异步请求的方式)来完成,然而,不是说你的主线程阻塞在那里等待子线程来完成--也不用调用Thread.wait()或Thread.sleep();替代的方法是主线程需要为子线程提供一个handler,以便完成时能够交给主线程,以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。
    第二,如何避免ANR
    1.运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
    2.应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点)
    3.避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。

    总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。
posted @ 2015-06-24 16:00 Terry Zou 阅读(193) | 评论 (0)编辑 收藏
仅列出标题  下一页
<2019年10月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

Java

搜索

  •  

最新随笔

最新评论

阅读排行榜

评论排行榜