Android
来源:互联网 发布:windows vista32位下载 编辑:程序博客网 时间:2024/05/17 05:10
关闭线程
1.非阻塞线程 设置flag
2.被阻塞了的线程(如socket的阻塞语句,sleep等),用interrupt,会抛个异常
断点续传
- //设置下载的数据位置XX字节到XX字节
- Header header_size = new BasicHeader("Range", "bytes=" + size + "-"
- + fileSize);
- request.addHeader(header_size);
- response = client.execute(request);
- //获取文件对象,开始往文件里面写内容 同时在while中设置条件,进行暂停
- File myTempFile = new File(filePath + "/" + filename);
- RandomAccessFile fos = new RandomAccessFile(myTempFile, "rw");
- //从文件的size以后的位置开始写入,其实也不用,直接往后写就可以。有时候多线程下载需要用
- fos.seek(size); //跳到size字节后
- byte buf[] = new byte[1024];
- long downloadfilesize = 0;
- do {
- int numread = is.read(buf);
- if (numread <= 0) {
- break;
- }
- fos.write(buf, 0, numread);
- if (handler != null) {
- Message msg = new Message();
- downloadfilesize += numread;
- double percent = (double) (downloadfilesize + size)
- / fileSize;
- msg.obj = String.valueOf(percent);
- handler.sendMessage(msg);// 更新下载进度百分比
- }
- } while (true);
oom内存溢出
1.
- 1. InputStream is = this.getResources().openRawResource(R.drawable.pic1);
- BitmapFactory.Options options=new BitmapFactory.Options();
- options.inJustDecodeBounds = false;
- options.inSampleSize = 10; //width,hight设为原来的十分一
- Bitmap btp =BitmapFactory.decodeStream(is,null,options);
2.
- 2. if(!bmp.isRecycle() ){
- bmp.recycle() //回收图片所占的内存
- system.gc() //提醒系统及时回收
- }
3.创建弱引用(不论空间足不足都回收)或软引用(空间不足回收)的map
private final Map<String, Reference<Bitmap>>softMap = Collections.synchronizedMap(new HashMap<String, Reference<Bitmap>>());
然后控制map里图片的大小??
4.manifest设置largeHeap,可以使用最大内存(超过100M,由dalvik.vm.heapsize限制)
<application
android:largeHeap="true"
android:icon="@drawable/ic_launcher"
5.通过上面的方式解决了,但是这并不是最完美的解决方式。
通过一些了解,得知如下:
优化Dalvik虚拟机的堆内存分配
对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f;在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
Android堆内存也可自己定义大小
对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了 优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的堆内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理
recycle后报错
trying to use a recycled bitmap,一般是被recycled的图片还有人用,需要将所有包含这张图片的对象调用null,比如bitmap = null,image view.setImageBitmap(null), list.remove等等
如果还不行,可以重写imageview,在其onDraw中捕获这个异常
- public class MyImageView extends ImageView {
- public MyImageView (Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- @Override
- protected void onDraw(Canvas canvas) {
- try {
- super.onDraw(canvas);
- } catch (Exception e) {
- System.out
- .println("MyImageView -> onDraw() Canvas: trying to use a recycled bitmap");
- }
- }
- }
防止两次上传,重复上传
在点击进行联网后,禁止进行下次点击(点击按钮变灰),直到联网结束(成功或失败后)才可以继续点击。
算法
1.快排
class Quick {
public void sort(int arr[],int low,int high) {
int l = low;
int h = high;
int povit = arr[low];
while (l < h) {
while (l < h && arr[h] >= povit) {
h--;
}
if (l < h) {
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp;
l++;
}
while (l < h && arr[l] <= povit) {
l++;
}
if (l < h) {
int temp = arr[h];
arr[h] = arr[l];
arr[l] = temp;
h--;
}
}
print(arr);
System.out.print("l=" + (l + 1) +"h=" + (h + 1) +"povit=" + povit
+ "\n");
if (l > low)
sort(arr, low, h - 1);
if (h < high)
sort(arr, l + 1, high);
}
}
2.A星算法(寻路,塔防)
3.装箱算法(找你妹)
android 虚拟机
java 虚拟机 基于栈架构,从栈上读取数据,字符串常量被重复使用,包含相同的方法签名
Dalvik 执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小,使用一个常量池
ART 安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大
设计模式
1.单例
- public class Singleton {
- private static Singleton uniqueInstance = null;
- private Singleton() {
- // Exists only to defeat instantiation.
- }
- public static Singleton getInstance() {
- if (uniqueInstance == null) {
- uniqueInstance = new Singleton();
- }
- return uniqueInstance;
- }
- // Other methods...
- }
2.观察者模式
当被观察者变化了,会通知所有的观察者
public void changed()
{
for(Observer observer:observers)
{
observer.update(a,b,c);
}
}
3.代理模式
委托代理
Activity 生命周期
- public class MyActivity extends Activity {
- // 在Activity生命周期开始时被调用
- public void onCreate(Bundle icicle) {
- }
- // onCreate完成后被调用,用来回复UI状态
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- }
- //当activity从停止状态重新启动时调用
- public void onRestart(){
- }
- //当activity对用户即将可见的时候调用。
- public void onStart(){
- }
- //当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经 可以传递给它
- public void onResume(){
- }
- // Activity即将移出栈顶保留UI状态时调用此方法
- public void onSaveInstanceState(Bundle savedInstanceState) {
- }
- // 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占 用 CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
- public void onPause(){
- }
- //当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
- public void onStop(){
- }
- //在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况
- public void onDestroy(){
- }
Service 生命周期
onCreate->onStartCommand->onDestroy
onCreate->onBind->onUnbind->onDestroy
Fragment 生命周期
多线程
AsyncTask
Thread
activity.runOnUiThread(runnable)//可以在线程中直接调,会再主线程运行
view.post(runnable)//加到消息队列,一样可以在线程中直接调,会再主线程运行
Handler
线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
//创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
//将线程放入池中进行执行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
socket
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
i/o复用:select poll epoll
大端小端
大端:是指数据的高位,保存在内存的低地址中 网络字节序 java
小端:是指数据的高位保存在内存的高地址中 intel x86主机
xml解析
1.DOM 整个文档读到内存中
2.SAX 基于事件驱动,一点一点读
3.PULL 与SAX大同小异,导航到什么标签
jni
java调c++
jstring Java_com_xzw_jni_TestJni_hello(JNIEnv* env, jobject thiz){
return (*env)->NewStringUTF(env, "哈哈 !");
}
public native String hello();
static{
System.loadLibrary("testJni");
}
c++调java
在c中找java类
cls = env->FindClass("User/DataManager");
通过java类找静态方法
mid = env->GetStaticMethodID(cls,"createInstance","(Ljava/lang/String;)LUserSecurityManager/UserDataManager;");
通过静态方法获得对象
jobject objUserDataManager = env->CallStaticObjectMethod(cls,mid,jPath);
查找普通方法
mid=env->GetMethodID(cls,"AuthUser","(Ljava/lang/String;Ljava/lang/String;)LUserSecurityManager/UserInfo;");
通过对象调普通方法
jobject jUserInfo1=env->CallObjectMethod(objUserDataManager,mid,userName,userPasswd);
xmpp
基于XML的协议,用于服务类实时通讯
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- android
- android
- Android
- Android
- android!!!
- android
- android
- android
- android
- android:
- crontab执行脚本中文乱码,手动执行没有问题
- 【思考题】任意长度有理数乘法运算
- 黑马程序员_C#基础篇总结3
- 实现算法2.17的程序
- Learn Beautiful Soup(3)——使用Beautiful Soup进行查找
- Android
- 知识的深度和广度
- 修改openwrt的配置界面luci的方法
- 蔡勒公式
- Linux驱动框架之——Input子系统
- 手游《奔跑吧?骚年!》技术分享(四):矩形碰撞检测
- [leetcode] Reverse Linked List II
- hdu 1800 Flying to the Mars
- POJ3422 费用流