PDA

View Full Version : آموزش نحوه تعریف یک آبجکت اشاره گر در کلاس های اندروید



farhad_shiri_ex
پنج شنبه 13 اردیبهشت 1397, 00:14 صبح
با سلام
تا حالا پیش اومده که بخواهید از یک کلاس دیگه که توی یک پکیج دیگه هست به یک آبجکت Context View که در یک کلاس دیگه هست دسترسی داشته باشید همانطور که می دانید کلاسهای Context اندروید را نمی تونیم به صورت استاتیک استفاده کنیم به علت نشت حافظه memory leak خوب پس راه حل چی میتونه باشه من خودم اینطوری مشکل رو برطرف کردم سعی کردم از شی Fly weight استفاده کنم البته از الگوی singletone هم استفاده کردم و از الگوی تزریق وابستگی DI.

1-در مرحله اول یک اینترفیس نوشتم که بتونم به صورت Observerable ازش استفاده کنم و نقش اشاره گر به آبجکت رو برام اجرا کنه.

public interface ViewReferencePointerService<T> {

T getPointerView();

int getPosition();
}


2- در مرحله بعد یک کلاس کنترلر نوشتم که پیاده سازی اشاره گر رو برام انجام بده!

public final class ObjectControl {

public static class ObjectPointer implements ViewReferencePointerService<Object> {

private Object mViewReference;

private int mItemPos = -1;

private ObjectPointer(Object viewReference, int mItemPos) {
this.mViewReference = viewReference;
this.mItemPos = mItemPos;
}

public static ObjectPointer newInstance(Object viewObject,int adapterPos) {
return new ObjectPointer(viewObject,adapterPos);
}

public static ObjectPointer newInstance(Object viewObject) {
return new ObjectPointer(viewObject,0);
}

@Override
public Object getPointerView() {
return mViewReference;
}

@Override
public int getPosition() {
return mItemPos;
}
}

}


3- در این مرحله تو یک کلاس دیگه مثل View Adapter برای لیست ویوی که دارم اومدم مقدار اشاره گر را با View که لازم دارم بهش دسترسی پیدا کنم مقدار دهی کردم!

public static ViewReferencePointerService<Object> sFavoriteViewReferencePointerService;
sFavoriteViewReferencePointerService = ObjectControl.ObjectPointer.newInstance(myView, 0);


4- تو این مرحله هم اومدم توی یک اکتیویتی دیگه ویا یک فرگمنت دیگه مقدار اشاره گر رو خوندم و ازش استفاده میکنم و البته به کلاسی که میخوام Cast میکنم و باهاش کار میکنم البته اگر بخواهید که از کست آبجکت استفاده نکنید نوع کلاستون رو در اینترفیس اشاره گر که به صورت generic تعریف کردم مقدار دهی کنید

TextView viewPtr = (TextView) ArchivePlanRecyclerViewAdapter.sFavoriteViewRefere ncePointerService.getPointerView();


5- در آخر هم که تو مخرب کلاس اکتیویتی میخوام که آبجکت اشاره گر رو null کنه که توسط GC حذف بشه!
وباالطبع هر جا که خواستید از شی اشاره گر استفاده نکنید بهتر که حتما این دسترسی را null کنید.

@Override
protected void finalize() throws Throwable {
ArchivePlanRecyclerViewAdapter.sFavoriteViewRefere ncePointerService =null ;
super.finalize();
}


دوستان اگر سوالی بود در خدمت هستم ویا اگر نظری دارند خوشحال میشم بدونم...!