Android 소스 코드 의 정적 공장 방법
오늘 우 리 는 간단 한 공장 모델 의 일부 상황 과 안 드 로 이 드 소스 코드 에서 의 응용 을 공유 합 니 다.
단순 공장 모드
정의.
간단 한 공장 모델 은 클래스 의 생 성 모델 로 정적 공장 방법 (Static Factory Method) 모델 이 라 고도 부른다.간단 한 공장 모델 은 한 공장 대상 이 어떤 제품 류 의 인 스 턴 스 를 만 들 지 결정 하 는 것 이다.
구조
간단 한 공장 모델 과 관련 된 역할:
이루어지다
추상 적 인 제품 역할
abstract class Product {
//
public void methodSame() {
//
}
//
public abstract void methodDiff();
}
구체 적 인 제품 역할
class ConcreteProduct extends Product {
//
public void methodDiff() {
//
}
}
공장 역할
class Creator {
//
public static Product getProduct(String arg) {
Product product = null;
if (arg.equalsIgnoreCase("A")) {
product = new ConcreteProductA();
// product
}
else if (arg.equalsIgnoreCase("B")) {
product = new ConcreteProductB();
// product
}
return product;
}
}
필드 사용
다음 과 같은 상황 에서 간단 한 공장 모델 을 사용 하 는 것 을 고려 할 수 있다.
장점.
결점.
Android 에서 간단 한 공장 모델 의 응용
안 드 로 이 드 에서 우리 가 알 고 있 는 간단 한 공장 방법 을 사용 한 곳 은 비트 맵 대상 획득, Fragment 생 성 등 이 있다.이제 우리 따로 보 자.
Bitmap 소스 코드 분석
우선, 우 리 는 new 방법 을 통 해 Bitmap 대상 을 만 들 수 없습니다. Bitmap 류 의 구조 함 수 는 개인 적 이 고 JNI 를 통 해 만 예화 할 수 있 기 때 문 입 니 다.
다음 에 우 리 는 마음대로 입 구 를 찾 아 보기 시작 했다. 예 를 들 어:
Bitmap bmp = BitmapFactory.decodeFile(String pathName);
우 리 는 소스 코드 중의 호출 관 계 를 다음 과 같이 찾 아 냈 다.
public static Bitmap decodeFile(String pathName) {
return decodeFile(pathName, null);
}
public static Bitmap decodeFile(String pathName, Options opts) {
Bitmap bm = null;
InputStream stream = null;
try {
stream = new FileInputStream(pathName);
bm = decodeStream(stream, null, opts);
} catch (Exception e) {
/* do nothing.
If the exception happened on open, bm will be null.
*/
Log.e("BitmapFactory", "Unable to decode stream: " + e);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// do nothing here
}
}
}
return bm;
}
public static Bitmap decodeStream(InputStream is, Rect outPadding, Options opts) {
// we don't throw in this case, thus allowing the caller to only check
// the cache, and not force the image to be decoded.
if (is == null) {
return null;
}
Bitmap bm = null;
Trace.traceBegin(Trace.TRACE_TAG_GRAPHICS, "decodeBitmap");
try {
if (is instanceof AssetManager.AssetInputStream) {
final long asset = ((AssetManager.AssetInputStream) is).getNativeAsset();
bm = nativeDecodeAsset(asset, outPadding, opts);
} else {
bm = decodeStreamInternal(is, outPadding, opts);
}
if (bm == null && opts != null && opts.inBitmap != null) {
throw new IllegalArgumentException("Problem decoding into existing bitmap");
}
setDensityFromOptions(bm, opts);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_GRAPHICS);
}
return bm;
}
private static native Bitmap nativeDecodeStream(InputStream is, byte[] storage,
Rect padding, Options opts);
/**
* Set the newly decoded bitmap's density based on the Options.
*/
private static void setDensityFromOptions(Bitmap outputBitmap, Options opts) {
if (outputBitmap == null || opts == null) return;
final int density = opts.inDensity;
if (density != 0) {
outputBitmap.setDensity(density);
final int targetDensity = opts.inTargetDensity;
if (targetDensity == 0 || density == targetDensity || density == opts.inScreenDensity) {
return;
}
byte[] np = outputBitmap.getNinePatchChunk();
final boolean isNinePatch = np != null && NinePatch.isNinePatchChunk(np);
if (opts.inScaled || isNinePatch) {
outputBitmap.setDensity(targetDensity);
}
} else if (opts.inBitmap != null) {
// bitmap was reused, ensure density is reset
outputBitmap.setDensity(Bitmap.getDefaultDensity());
}
}
호출 과정 을 분석 해 보면 decodeFile (String pathName) 이 decodeFile (String pathName, Options opts) 을 호출 한 것 을 볼 수 있 습 니 다. 두 매개 변수의 decodeFile 방법 에서 decodeStream (InputStream is, Rect outPadding, Options opts) 방법 을 호출 한 다음 에 nativeDecodeAsset 또는 nativeDecodeStream 을 호출 하여 Bitmap 대상 을 구축 합 니 다.이 두 가 지 는 모두 native 방법 입 니 다.setDensity FromOptions 방법의 디 코딩 밀 도 를 설정 하 는 작업 을 통 해 우리 가 원 하 는 Bitmap 대상 을 되 돌려 줍 니 다.
/** * Creates Bitmap objects from various sources, including files, streams, and byte-arrays. */
BitmapFactory 의 설명 을 보면 이 공장 은 서로 다른 자원 에서 Bitmap 대상 을 만 드 는 것 을 지원 합 니 다. files, streams, by te - arrays 를 포함 하지만 호출 관 계 는 대동소이 합 니 다.
Fragment 생 성
가끔 은 간단 한 공장 모델 을 간소화 하기 위해 우 리 는 추상 적 인 제품 류 와 공장 류 를 합병 하여 정태 적 인 공장 방법 을 추상 적 인 제품 류 로 옮 길 수 있다.Fragment 의 설립 은 간단 한 공장 방법 으로 추상 적 인 제품 류 가 없 기 때문에 공장 류 는 실현 제품 류 에 넣 었 다.
AndroidStudio 에 new Instance 를 입력 하면 Fragment 의 간단 한 공장 방법 을 자동 으로 보완 합 니 다.
public static TasksFragment newInstance() {
Bundle args = new Bundle();
TasksFragment fragment = new TasksFragment();
fragment.setArguments(args);
return fragment;
}
정적 공장 방법 을 사용 하면 외부 에서 들 어 오 는 인 자 를 Fragment. setArgument 를 통 해 자신 에 게 저장 할 수 있 습 니 다. 그러면 우 리 는 Fragment. onCreate (...) 호출 할 때 이 인 자 를 꺼 낼 수 있 습 니 다.
이렇게 쓰 면 무슨 좋 은 점 이 있 습 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 소스 코드 의 정적 공장 방법오늘 우 리 는 간단 한 공장 모델 의 일부 상황 과 안 드 로 이 드 소스 코드 에서 의 응용 을 공유 합 니 다. 간단 한 공장 모델 은 클래스 의 생 성 모델 로 정적 공장 방법 (Static Factory M...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.