Android

来源:互联网 发布:windows vista32位下载 编辑:程序博客网 时间:2024/05/17 05:10

关闭线程

1.非阻塞线程 设置flag

2.被阻塞了的线程(如socket的阻塞语句,sleep等),用interrupt,会抛个异常




断点续传

  1.             //设置下载的数据位置XX字节到XX字节  
  2.             Header header_size = new BasicHeader("Range""bytes=" + size + "-"  
  3.                     + fileSize);  
  4.             request.addHeader(header_size);  
  5.             response = client.execute(request);  


  1.             //获取文件对象,开始往文件里面写内容 同时在while中设置条件,进行暂停 
  2.             File myTempFile = new File(filePath + "/" + filename);  
  3.             RandomAccessFile fos = new RandomAccessFile(myTempFile, "rw");  
  4.             //从文件的size以后的位置开始写入,其实也不用,直接往后写就可以。有时候多线程下载需要用  
  5.             fos.seek(size); //跳到size字节后 
  6.             byte buf[] = new byte[1024];  
  7.             long downloadfilesize = 0;  
  8.             do {  
  9.                 int numread = is.read(buf);  
  10.                 if (numread <= 0) {  
  11.                     break;  
  12.                 }  
  13.                 fos.write(buf, 0, numread);  
  14.                 if (handler != null) {  
  15.                     Message msg = new Message();  
  16.                     downloadfilesize += numread;  
  17.                     double percent = (double) (downloadfilesize + size)  
  18.                             / fileSize;  
  19.                     msg.obj = String.valueOf(percent);  
  20.                     handler.sendMessage(msg);// 更新下载进度百分比  
  21.                 }  
  22.             } while (true);

 


oom内存溢出

1.

  1. 1. InputStream is = this.getResources().openRawResource(R.drawable.pic1); 
  2.      BitmapFactory.Options options=new BitmapFactory.Options(); 
  3.      options.inJustDecodeBounds = false
  4.      options.inSampleSize = 10;   //width,hight设为原来的十分一 
  5.      Bitmap btp =BitmapFactory.decodeStream(is,null,options);

2.

  1. 2. if(!bmp.isRecycle() ){ 
  2.          bmp.recycle()   //回收图片所占的内存 
  3.          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中捕获这个异常

  1. public class MyImageView extends ImageView {  
  2.   
  3.     public MyImageView (Context context, AttributeSet attrs) {  
  4.         super(context, attrs);  
  5.     }  
  6.   
  7.     @Override  
  8.     protected void onDraw(Canvas canvas) {  
  9.         try {  
  10.             super.onDraw(canvas);  
  11.         } catch (Exception e) {  
  12.             System.out  
  13.                     .println("MyImageView  -> onDraw() Canvas: trying to use a recycled bitmap");  
  14.         }  
  15.     }  
  16.   
  17. }



防止两次上传,重复上传

在点击进行联网后,禁止进行下次点击(点击按钮变灰),直到联网结束(成功或失败后)才可以继续点击。


算法

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.单例

  1. public class Singleton {  
  2.     private static Singleton uniqueInstance = null;  
  3.    
  4.     private Singleton() {  
  5.        // Exists only to defeat instantiation.  
  6.     }  
  7.    
  8.     public static Singleton getInstance() {  
  9.        if (uniqueInstance == null) {  
  10.            uniqueInstance = new Singleton();  
  11.        }  
  12.        return uniqueInstance;  
  13.     }  
  14.     // Other methods...  

2.观察者模式

当被观察者变化了,会通知所有的观察者

public void changed()

{

    for(Observer observer:observers)

    {

        observer.update(a,b,c);

    }

}

3.代理模式

委托代理



Activity 生命周期


  1. public class MyActivity extends Activity {
  2. // 在Activity生命周期开始时被调用
  3. public void onCreate(Bundle icicle) {
  4. }
  5. // onCreate完成后被调用,用来回复UI状态
  6. public void onRestoreInstanceState(Bundle savedInstanceState) {
  7. }
  8. //当activity从停止状态重新启动时调用
  9. public void onRestart(){
  10. }
  11. //当activity对用户即将可见的时候调用。
  12. public void onStart(){
  13. }
  14. //当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经 可以传递给它
  15. public void onResume(){
  16. }
  17. // Activity即将移出栈顶保留UI状态时调用此方法
  18. public void onSaveInstanceState(Bundle savedInstanceState) {
  19. }
  20. // 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占 用 CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
  21. public void onPause(){
  22. }
  23. //当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
  24. public void onStop(){
  25. }
  26. //在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况
  27. public void onDestroy(){
  28. }


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的协议,用于服务类实时通讯











 



0 0
原创粉丝点击