目前是大多数打算换工作的最佳时期,像boss直聘,拉勾网,智联每天都有大量的招聘信息,这里我选取了最新拉勾网上的某个公司的android岗位的职位要求.看看究竟有什么是公司关心或者是问的最多的面试问题.
岗位职责类就不说了, 都是开发中要遇到的问题,比较官方笼统.
要求(1)
这里先说设计模式之前先说下面向对象的六大基本原则:
单一职责:
通俗来讲就是一个类只有一项职责,不是自己的业务场景不要掺和在一个类里面,其实在项目过程中我们都不自觉的在用这种单一职责.
开闭原则:
意思就是说当产品需求变更的时候,对代码的扩展进行开放,对修改源代码进行关闭,这里有点以增加代码的数量来确保之前功能稳定的意思,但是也是最可行的方式.
里氏替换原则:
说的就是父类子类继承的关系,子类继承父类,共享父类中的已经定义好的非抽象方法,就像通常我们new一个Activity时候通常都会继承BaseActivity了,然后在BaseActivity中可以在写初始化操作,而继承的子类就可以直接使用方法,而无需平凡的创建和销毁.
接口最小化原则:
意思是应该在对类与类之间接口应该细化到最小,这样有利于解耦和,就有点和单一职责一样,相同点在于都是尽可能的缩小范围,不同点在于单一职责说的是单纯的一个类,而接口最小化说的是调用者与接收者之间的关系应细化到最小.
依赖倒置原则:
说的是模块之间不应该产生直接的调用关系,应该通过接口的形式来调用,底层模块应该遵循接口来设定,而不是接口根据底层来设定.
迪米特原则:
一个类对于自己依赖的类,应该知道的越少越好,这样可以降低耦合度
将实现的逻辑都封装在类的内部,实现高内聚,低耦合
=================================================================================
下面来说下设计模式(在之前的文章中有提到过)
单例模式
单例可以供全局访问,避免频繁的创建销毁对象,节省内存开支.
这里就直接写一个静态内部类的单例
public class SingleInstance{
private static class MySinleInstance{
public static final SingleInstance instance=new SingleInstance();
}
public static SingleInstance getInstance(){
return MysinleInstance.instance;
}
}
工厂模式(factory):
我们要写一个张三要读书的方法.其中有语文,数学,英语三本书.
首先我们定一个book类
public interface Book{
void read();
}
然后语文,数学,英语都是需要实现这个接口
public class ChineseBook implements Book{
public void read(){
system.out.print("ChineseBook");
}
}
...............
然后就是张三读书的方法
public class ReanMan{
public static Book readbook(String name) throws Exception{
if(name.equalsIgnoreCase("chinesebook")){
return new ChineseBook();
}
if(name.equalsIgnoreCase("mathbook")){
return new MathBook();
}
return new EnglishBook();
}
}
最后就是使用方法
ReanMan man = ReanMan.readbook("chinesebook");//让张三来读语文书
man.read();//一键启动
===============================================================================
装饰者模式:
在不影响其他对象的前提下,装饰者模式可以动态的透明的给单个对象添加职责.
代理模式:
抽象对象角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
public abstract class AbstractObject{
public abstract void operation();
}
目标对象角色:定义了代理对象所代表的目标对象。
public class RealObject extends AbstractObject{
@override
public void opeation(){
//操作
System.out.print("操作");
}
}
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或之后,执行某个操作,而不是单纯地将调用传递给目标对象。
public class ProxyObject extends AbstractObject{
RealObject realObject=new RealObject();
@override
public void operation(){
//调用对象之前可以做项目操作
realobject.operation();
//调用对象后可以做相关操作
}
使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象、创建开销大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能。
适配器模式:
我们需要实现某个功能,而现在实现这个功能的组件不必我们自己开发,可以通过第三方的组件(即别人的代码或者自己曾经写过的代码)来实现,但第三方组件的接口与现在所定义的接口不一致(即类名,方法名不一样),那么在不修改两方接口的情况下,可以通过采用适配器模式来解决这一问题。
Activity生命周期
onCreate()-onStart()-onResume()-onPause()-onStop()-onDestroy();
Service
(1)开始startService(),结束:stopService()
(2)开始bindService(),结束:onBindService();
Brodercast
动态广播,需要继承BroadcastReceiver,重写onReceive方法,注册广播registered,解注册unregistered
静态广播,需要在manifast.xml中给定创建,创建后就一直存在,解注册在这里提到过
ContentProvider
这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式,
其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据
Fragment生命周期
onattch()-oncreate()-oncreteView()-onActivityCreated()-onStart()-onResume-onPause()-onStop()-onDeatroyView()-onDestory()-onDetach()
解决程序OOM问题:
图片过大Bitmap导致OOM
bitmap.recycle();
bitmap = null;
handle依赖在Activity后Activity销毁导致OOM
弱引用,静态内部类
广播未及时销毁导致OOM
ListView中adapter使用不当重复叠加convertview
HTTP请求和JSON解析(原生):
在android6.0之后google就废弃了HttpClient,而采用一直有的HttpUrlConnection进行网络请求,在网络请求框架中,okhttp配合okio.jar使用是目前采用最主流的网络请求框架之一,这里说说原生请求是怎么弄.
String path="http://www.XXXXXXX";
URL url=new URL(path);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setConnectTimeout(5*1000);//超时时间
conn.setRequestMethod("GET");//请求方式
InputStream in=conn.getInputStream();//得到输入流
XXX
//建立输出流outputStrem写入文件
JSON解析
JSONObject object=new JSONObject(requestion);
JSONArray array=new JSONArray(object.getString("date"));
for(int i=0;i<array.size();i++){
JSONObject jo = (JSONObject) array.get(i);
}