بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
آموزش رفع مشکل reflection ui استاد
سلام
وقتی از reflection استاد تویه پروژه هامون استفاده میکنیم تویه شبیه ساز بدون هیچ خطای به درستی کار میکنه ولی وقتی که خروجی برنامه رو میگیریم و داخل گوشی واقعی نصب میکنیم برنامه کرش میکنه!
برای رفع این مشکل باید دو خط کد به برناممون اضافه کنیم:
اولین مشکل مربوط میشه به خوندن یک فیلد Private بدون دسترسی ، که برای رفع مشکل باید خط زیر برای دسترسی دادن به اون فیلد نوشته بشه :
field.setAccessible(true);
این مشکل توسط آقای سلطانی داخل این تاپیک رفع شد.
دومین مشکل مربوط میشه به پیدا شدن فیلدی به اسم serialVersionUID که id مربوط بهش برابر صفره، که در این صورت برنامه کرش میکنه
برای رفع این مشکل این کد رو به برنامه اضافه میکنیم:
if (name.contains("$")||name.contains("serialVersionUID")) {
continue;
}
کد قسمت مربوط به reflection بعد از این تغییرات :
// reflect ui elements
{
Class clazz = ui.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);/*تغییر قسمت اول*/
String name = field.getName();
Class type = field.getType();
/*
تغییر قسمت دوم
*/
if (name.contains("$") || name.contains("serialVersionUID")) {
continue;
}
int id = UBase.get().getResources().getIdentifier(name, "id", UBase.get().getPackageName());
try {
field.set(ui, activity.findViewById(id));
} catch (IllegalAccessException e) {
Log.i("LOG", "Error");
e.printStackTrace();
}
}
}
0
0
مشکل استفاده از رفلکشن اینکه موقعی که minifyEnabled رو true میکنیم برنامه کرش میکنه کسی از دوستان راه حلی برای این موضوع داره ؟ چه کدی باید داخل پروگارد نوشت که خطا نگیره از برنامه ؟ (5 سال پیش)
+1
0
اصلا رفلکشن چی هست؟؟ میشه یه توضیح بدید من یادم بیاد؟؟ ممنونم. (5 سال پیش)
0
0
با رفلکشن یه کارای عجیب و غریبی میشه کرد ساده ترین و قابل فهم ترین کاری که استاد آموزشش داده اینکه شما دیگه نیازی به تعریف find.view.by.id برای باتون های ادیت تکست ها و.. ندارید و برنامه به طور اتوماتیک این کارهارو براتون انجام میده.آموزش جدیدی که استاد تدوینش کرده (notify app) یه چیز مثل رفلکشن هستش یه جورایی کد نویسی رو راحتر میکنه برای برنامه نویس (5 سال پیش)
برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال
Criss
5 سال پیش
+1
0
این برای تمام متغیر های پابلیک از تغییر نامشون بعد از minify جلوگیری میکنه :
-keepclassmembers class com.freestyler.buyon.criss.struct.Order {
public *;
}
سلام ممنون از پاسخگوییتون دو تا سوال پیش میاد اول اینکه تویه این موردی که بنده گفتم تست کردید این کد رو جواب میده ؟ سوال دوم اینکه اگه بنا باشه متد ها و متغییر های public تغییر نام ندن که برنامه راحت تر سورسش باز میشه. نمیشه کدی زد که فقط کلاس UI استاد تغییر نام ندن بقیه ولی تغییر نام بدن ؟ (5 سال پیش)
اکر دقت کنید آدرس کلاس همراه با پکیجی که اون کلاس درش قرار داره گفته شده com.freestyler.buyon.criss.struct.Order و این فقط متغیره های پابلیک کلاس Order رو از تغییر نام جلوگیری میکنه و آسیبی به جاهای دیگه پروژه نمیزنه ، شما باید آدرس کلاس UI استاد رو همراه با آدرس پکیجی که درش قرار داره رو بدید بهش (5 سال پیش)
حرف شما کاملا درست ، اگه بنا به استفاده کلاس استاد داخل برنامه باشه ما باید تویه کلاس های که از find.view.by.id استفاده میکنیم کلاس استاد رو فراخوانی کنیم در این صورت هم باید متغییر های اون کلاس رو مثل کدی که شما بالا نوشتید از minify شدن جلو گیری کنیم که با این کار باید اسم تمام کلاس هارو بالا بنویسیم.من شخصا از پلاگین FindViewByMe استفاده میکنم بدون این دردسر ها . (5 سال پیش)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .