مبحث Activity چرا erro میده؟
من طبق گفته ویدیو بقیه مراحل چرخه حیات یک اکتیویتی رو به کلاس enhancedActivity اضافه کردم ولی چرا ارور میده؟
package com.uncocoder.course.app.g_sample;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
public abstract class ActivityEnhanced extends Activity {
private static final int LENGTH_SHORT = 0;
@Override
protected void onPause() {
Log.i(G.LOG_TAG, "Pause from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "Pause from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
super.onPause();
}
@Override
protected void onResume() {
Log.i(G.LOG_TAG, "Resume from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onResume from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
G.currentActivity=this;
super.onResume();
}
@Override
protected void onDestroy() {
Log.i(G.LOG_TAG, "onDestroy from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onDestroy from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
super.onDestroy();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
Log.i(G.LOG_TAG, "onCreate from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onCreate from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
super.onCreate(savedInstanceState);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
Log.i(G.LOG_TAG, "onStart from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onStart from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
super.onStart();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
Log.i(G.LOG_TAG, "onRestart from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onRestart from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
super.onRestart();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Log.i(G.LOG_TAG, "onStop from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onStop from " + getClass().getSimpleName() + " activity",LENGTH_SHORT).show();
super.onStop();
}
}
سلام .
بطور کلی به دو دلیل پروژه آقای rad اجرا نمیشد که هر کدام رو جداگانه توضیح میدم .
1. اولین دلیل که نوع ارورر رو میتونید توسط تصویری که ضمیمه کردم ببینید به خاطر فایل های تولید شده در فولدر gen بود . به این صورت که فایل های تولید شده در فولدر gen برای ماقبل این بود که شما چندین اکتیوتی و فایل xml بسازید بود و برای اجرای دوباره پروژه نیاز بود که یکبار فایلهای درون فولدر gen متناسب با تغییرات جدید باز تولید بشن . برای اینکار هم من از طریق منوی project و گزینه clean اینکارو انجام دادم و اررور مربوط دیگه نمایش داده نشد .

2. خب بعد از اینکه مورد بالا رو برطرف شد , مجددا پروژه قابل اجرا نبود که با بررسی متوجه شدم در نحوه مقدار دهی اشتباهی صورت گرفته بوده . از اونجایی که هدف پروژه نشون دادن مراحل Activity Life Cycle بود و برای اینکار از کلاس Toast استفاده شده , و از طرفی میدونیم که کلاس Toast برای انجام کار خودش به یک context ( چه از اپلیکیشن گرفته شده باشه چه از اکتیوتی) نیاز داره , و آقای rad هم تصمیم گرفته بودن از کلاسی که در حال حاضر در حال اجرا هست برای اینکار استفاده کنن , که همین خاطر یک متغیر رو در کلاس G معرفی کرده بودند و در نهایت اون متغیر رو در متد onResume با اکتیوتی در حال اجرا مقدار دهی کرده بودند .
خب مشکل کار اینجا بود که همونطور که در الگوریتم اجرای اکتیوتی نشون داده شده , اولین متدی که اول از تمام متدها اجرا میشه متد onCreate هستش و متد های دیگه به دنبال اون .
کاری که آقای rad انجام داده بودند این بود که مقدار دهی فیلد currentActivity رو فقط و فقط در متد onResume انجام داده بودند و از طرفی همون لحظه که این فیلد رو مقدار دهی کرده بودن قصد داشتند که ازش در کلاس Toast استفاده کنند در صورتی که هنوز این فیلد مقدار دهی نشده است و مقداری برابر null دارد . مقدار دهی به شکل زیر بود :
@Override
protected void onResume() {
Log.i(G.LOG_TAG, "Resume from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity, "onResume from " + getClass().getSimpleName() + " activity", Toast.LENGTH_SHORT).show();
G.currentActivity = this; / تعریف کد در محل نادرست
super.onResume();
}
خب من برای رفع این اررور , مقدار دهی رو در متد onCreate که اول از هر متدی اجرا میشه انجام دادم , و با اینکه این مقدار دهی رو در متدهای بعد اون انجام ندادم , پروژه بدرستی اجرا شد و تمام متد ها بدرستی متن های خواسته شده رو نشون دادند . در نهایت متد onCreate به صورت زیر تغییر کرد :
@Override
protected void onCreate(Bundle savedInstanceState) {
G.currentActivity = this; // کد اضافه شده
Log.i(G.LOG_TAG, "onCreate from " + getClass().getSimpleName() + " activity");
Toast.makeText(G.currentActivity , "onCreate from " + getClass().getSimpleName() + " activity", Toast.LENGTH_SHORT).show();
super.onCreate(savedInstanceState);
}
خب دلیل اصلی این اررور به این خاطر بود که , یا نباید متد های که از لحاظ اجرای نسبت به متد onResume اولویت دارند رو نوشت ( که در این صورت متد onResume نسبت به متدها بعد خود مقدم بود و مقداردهی در این متد میبایست انجام میشد ) یا اگر این متد های نوشته شوند , مقدار دهی باید در متدی که اولویت اجرایی بیشتری دارد نوشته شود .
با این حال اگر آقای rad اسرار به استفاده از فیلد currentActivity نداشتن, به راحتی میتونستن از فیلد context که در کلاس G تعریف کرده بودند, بدون اینکه لازم باشه این فیلد رو مثلا در متدهای ( onCreate , onResume ) مقدار دهی کنن , این فیلد رو در دستور Toast بجای فیلد currentActivity جایگزین کنن و پروژه بدرستی کار میکرد .
دلیل این امر اینه که فیلد context در کلاس G تعریف شده و در متد onCreate کلاس G مقدار دهی شده و همونطور که میدونیم طبق تنظیمات آموزش داده شده در ویدئو های آموزشی , متد onCreate موجود در کلاس G قبل از متد onCreate موجود در کلاسای دیگه اجرا میشه و قبل اینکه هر دستوری بخواد اجرا بشه فیلد مورد نظر مقدار دهی شده و دیگه ارروری در این مورد ایجاد نخواهد شد.
اینم لینک دانلود فایل تصحیح شده و مرتب شده پروژه
لینک پروژه اصلاح شده
خب از اونجا که من در حال حاضر در حال یادگیری هستم , به این خاطر اطلاعاتم کامل نیست و مسلما امکان داره موردی رو اشتباه توضیح داده باشم ولی تا اینجا و در این مورد پیش اومده بخاطر آموزش خوب جناب آقاجانی تونستم که منبع اررور رو پیدا کنم و برطرفش کنم . در انتها اگر ایرادی در توضیحات بود لطفا به من اطلاع بدید .
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .