Android 설계 모드 파악 - (동적) 프록시 모드
16061 단어 안드로이드 디자인 모드
이런 모드에는 어떤 응용 장면이 있습니까?먼저 생활에 대응하는 장면을 이야기한다. 스타는 일반 상인에게 스타를 찾아 활동을 해야 한다고 통보를 받는다. 먼저 그의 매니저를 찾아야 한다. 그리고 매니저가 자질구레하거나 운영적인 일을 맡아야 한다. 스타는 구체적인 활동과 관련된 일을 하면 된다.여기 매니저의 역할은 대리인으로서
정적 에이전트
우선 정적 에이전트, 코드
/**
* ,
*/
public interface IStarDao {
void dowork();
}
/**
*
*
*/
public class SuperStarDao implements IStarDao {
@Override
public void dowork() {
//
}
}
/**
*
* , ,
*/
public class StarbrokerDaoProxy implements IStarDao {
private IStarDao starDao;
public StarbrokerDaoProxy(IStarDao starDao) {
this.starDao = starDao;
}
@Override
public void dowork() {
/*-- --*/
starDao.dowork();//
/*-- --*/
}
}
OK, 이로써 스타와 매니저는 창설이 끝났고, 그 다음은 어떻게 조작하는가. 먼저 구체적인 스타를 찾은 다음에 대응하는 매니저, 즉 대리류를 찾아 모든 일을 완성한다.
public void main() {
SuperStarDao starDao = new SuperStarDao();
StarbrokerDaoProxy proxy = new StarbrokerDaoProxy(starDao);
proxy.dowork();
}
동적 에이전트
동적 에이전트의 특징은 대리 대상을 미리 만들 필요가 없고 반사 메커니즘을 이용하여 운행할 때 대리 유형을 만들어 동적 대리 기능을 실현하는 것이다. 즉, 이곳의 스타들은 구체적인 매니저가 필요하지 않다는 것이다.이벤트가 있을 때 매니저를 만들 수 있습니다. 자신일 수도 있고 가족일 수도 있습니다. 그리고 원래 대리하는 일을 완성할 수 있습니다. 코드를 보십시오.
public void main() {
final IStarDao starDao = new SuperStarDao();
IStarDao proxy = (IStarDao) Proxy.newProxyInstance(
starDao.getClass().getClassLoader(),
starDao.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*-- --*/
Object returnValue = method.invoke(starDao, args);//
/*-- --*/
return returnValue;
}
});
proxy.dowork();
}
안드로이드에서의 응용
Retrofit, 다들 잘 아시겠지만retrofit의 핵심 내용은 동적 에이전트를 사용한 것입니다.
retrofit가 어떻게 일을 하는지 생각해 보세요.인터페이스에 설정해야 할 요청 방법을 쓰고 주석을 추가한 다음인터페이스의 실례를 만들면 네트워크 요청을 직접 호출할 수 있습니다.코드 보기:
public interface ApiService {
@POST(RetrofitHelper.APP_V1 + "/banner")
Observable<BaseEntity<List<Banner>>> getBanners();
}
ApiService mService = new Retrofit.Builder().baseUrl("").build().create(ApiService.class);
service.getBanners().enqueue(callback);
Api Service 인터페이스와 인터페이스 아래에 있는 getBanners 방법만 썼을 뿐 네트워크 요청을 할 수 있습니다.그래서 Retrofit는 우리가 네트워크 요청을 쓰는 것을 대체하는 구체적인 논리, 즉 에이전트를 완성하는 역할을 한다.
구체적으로 어떻게 대리했어요?비밀은 주로 이create(Api Service.class) 방법에서 원본 코드를 보십시오.
public <T> T create(final Class<T> service) {
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
ServiceMethod<Object, Object> serviceMethod =
(ServiceMethod<Object, Object>) loadServiceMethod(method);
OkHttpCall<Object> okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
이 newProxyInstance 메서드 보셨죠? 이것이 바로 동적 프록시 클래스를 만드는 방법입니다.voke 방법에서는 인터페이스 안의 방법의 일부 파라미터를 구체적으로 분해한 다음에 네트워크 요청의 전체 과정을 완성한다. 즉, 대리인이 당신을 도와 하는 일들이다.
여기에 겸사겸사 이 원본 코드들이 무슨 일을 했는지 간단히 말해서 모두가 직접 원본 코드를 연구하는 데도 편리하다
너의 하나, 바로 내가 나누는 동력❤️.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
안드로이드 디자인 모드 (1) 단일 모드 설명이런 실현 방식은 초기화할 때 단례로 사용해야 하는 상황에 적합하다.간단하고 거칠어서, 네가 이 실례를 필요로 하든지 말든지, 먼저 너에게 창설해 줄게.만약 단일 대상의 초기화가 매우 빠르고 메모리를 매우 적게 차지...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.