1静态内部类,内部类,匿名内部类,为什么内部类会持有外部类的引用?持有的应用是this,还是别的? 静态内部类:用static修饰的内部类 内部类:在一个类的内部重新创建一个类 匿名内部类:使用new生成的内部类 内部类的产生依赖于外部类,持有的是类名.this
2arraylist和vector的区别: java1.2 以后开始引入的vector vector:线程同步,当vector的元素超过初始大小的时候,vector会将他的容量翻倍。 arraylist:线程不同步,当arraylist的元素超过初始大小时,容量增加50%。。。
3Java中try catch finally 执行顺序 try===异常===catch===finally最后肯定走
4Java switch的作用类型 byte,int ,short,char,枚举,五中类型 java1.7以后增加了String
5activity 和fragment的生命周期 activity : onCreate==》onStart===》onResume===>onPause===>onStop===>onDestroy fragment: onAttach===>onCreate===>onCreateView===>onActityCreated===>onStart===>onResume===>onPause===>onStop===>onDestroyView===>onDestroy===>onDetach
6Android Activity什么时候进入“运行态”,什么时候进入“暂停态”,什么时候进入“停止态”?重新进入“运行态”需要经过哪几个生命周期? 运行态:经过onResume后进入运行态 暂停态:新的activity没有完全盖住原来的activity时,原来的activity进入暂停态 停止态: 新的activity完全盖住原来的activity时,原来的activity进入停止态 暂停态===》运行态:onPause==》onResume 停止态===》运行态:onStop==》onRestart==》onStart===》onResume
onCreate: 在这里创建界面 ,做一些数据的初始化工作 onStart: 到这一步变成用户可见不可交互 的 onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个 Activity的最上面,运行完弹出栈,则回到上一个Activity) onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情 从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候 你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在 onResume里读出来,注意:这个方法里做的事情时间要短,因为下一 个activity不会等到这个方法完成才启动 onstop: 变得不可见 ,被下一个activity覆盖了 onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方 法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判 断它,如果你有一个PRogress Dialog在线程中转动,请在onDestroy里 把他cancel掉,不然等线程结束的时候,调用Dialog的cancel方法会抛 异常的。 7Android 横竖屏切换生命周期的变化? ①竖屏装换成横屏:onSaveInstanceState–>onPause–>onStop–>onDestroy–>onCreate–>onStart–>onRestoreInstanceState–>onResume–> ②由横屏转竖屏生命周期①执行两遍。 总结: 1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切 横屏时会执行一次,切竖屏时会执行两次 2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次 3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
8Android onPause保存数据和onSaveInstanceState方法的区别? onSaveInstanceState这个方法肯定在onstop之前,但是不一定在onpause之前或者 之后 onSaveInstanceState:保存一些临时数据,比如:editext输入的文字,checkbox的选中状态,scrollview滑动位置,视频的播放进度。Android的editext等控件具有自动保存的功能,没必要实现onSaveInstanceState方法,但是必须要有id。 onPause:保存持久化的数据,比如忘数据库中插入一条数据。但是不要做大量的操作。否则会影响activity入栈。 9 dipatchTouchEevent,onInterceptTouchEvent,onTouchEvent三者的区别? dispatchTouchEvent:事件分发 onInterceptTouchEvent:事件拦截 onTouchEvent:事件处理 10 ReMoteView在哪些功能中使用? Notifycation(自定义通知栏布局)和appWiget 11SurfaceView 和view 的区别 surfaceview:采用双缓冲技术,在单独的线程中更行界面 view:在ui线程中更新界面 12Android中进程的优先级? 前台进程,可见进程,服务进程,后台进程,空进程 13Android中那些情况会出现内存泄漏 内存泄漏的原因:当某个对象已经停止使用,本应该被回收,但是别的对象仍然持有该对象的引用,导致该对象部内被及时的回收,从而留在堆内存中,从而产生了内存泄漏。 内存泄漏的影响:oom,程序的崩溃。 ①错误的使用单例模式
public class AppManager { private static AppManager instance; private Context context; private AppManager(Context context) { this.context = context; } public static AppManager getInstance(Context context) { if (instance != null) { instance = new AppManager(context); } return instance; }}1、传入的是application的Context:这将没有任何问题,因为单例的生命周期和Application的一样长 2、传入的是Activity的Context:当这个Context所对应的Activity退出时,由于该Context和Activity的生命周期一样长(Activity间接继承于Context),所以当前Activity退出时它的内存并不会被回收,因为单例对象持有该Activity的引用。 所以,正确的写法
public class AppManager { private static AppManager instance; private Context context; private AppManager(Context context) { this.context = context.getApplicationContext(); } public static AppManager getInstance(Context context) { if (instance != null) { instance = new AppManager(context); } return instance; }}②handler使用造成
public class MainActivity extends AppCompatActivity { private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { //... } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); loadData(); } private void loadData(){ //...request Message message = Message.obtain(); mHandler.sendMessage(message); }}在这种情况之下,如果activity销毁,但是消息队列中还有未处理的message,message持有handler的引用,二handler持有activity的引用,造成了内粗泄漏。
public class MainActivity extends AppCompatActivity { private MyHandler mHandler = new MyHandler(this); private TextView mTextView ; private static class MyHandler extends Handler { private WeakReference<Context> reference; public MyHandler(Context context) { reference = new WeakReference<>(context); } @Override public void handleMessage(Message msg) { MainActivity activity = (MainActivity) reference.get(); if(activity != null){ activity.mTextView.setText(""); } } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView)findViewById(R.id.textview); loadData(); } private void loadData() { //...request Message message = Message.obtain(); mHandler.sendMessage(message); } @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacksAndMessages(null); }}创建一个静态Handler内部类,然后对Handler持有的对象使用弱引用,这样在回收时也可以回收Handler持有的对象,使用mHandler.removeCallbacksAndMessages(null);是移除消息队列中所有消息和所有的Runnable。当然也可以使用mHandler.removeCallbacks();或mHandler.removeMessages();来移除指定的Runnable和Message。
③线程造成的内存泄漏。
//——————test1 new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { SystemClock.sleep(10000); return null; } }.execute();//——————test2 new Thread(new Runnable() { @Override public void run() { SystemClock.sleep(10000); } }).start();正确做法:
static class MyAsyncTask extends AsyncTask<Void, Void, Void> { private WeakReference<Context> weakReference; public MyAsyncTask(Context context) { weakReference = new WeakReference<>(context); } @Override protected Void doInBackground(Void... params) { SystemClock.sleep(10000); return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); MainActivity activity = (MainActivity) weakReference.get(); if (activity != null) { //... } } } static class MyRunnable implements Runnable{ @Override public void run() { SystemClock.sleep(10000); } } //—————— new Thread(new MyRunnable()).start(); new MyAsyncTask(this).execute();④资源未关闭造成的内存泄漏 对于使用了BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源的使用,应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
新闻热点
疑难解答