بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

مبحث Activity چرا erro میده؟

مدیریت گفتگو
rad 11 سال پیش
آخرین تغییر: 11 سال پیش

من طبق گفته ویدیو بقیه مراحل چرخه حیات یک اکتیویتی رو به کلاس 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();
}

}

نظرات

MOHAMAD 11 سال پیش
سلام . لطفا پروژه رو به پست اضافه کنید تا بررسی بشه .
rad 11 سال پیش
چطوری؟
MOHAMAD 11 سال پیش
خب ویدئو مربوط به خروجی گرفتن از رو ببین . داخل بخش یک هست
rad 11 سال پیش
متوجه نشدم چی کار کنم؟
rad 11 سال پیش
چی کار کنم؟
MOHAMAD 11 سال پیش
لطفا صبر کنید دارم پروژتون رو بررسی میکنم.
MOHAMAD 11 سال پیش
ایراد رو پیدا کردم . فعلا پروژه رو آپلود میکنم بعدش توضیح میدم . بفرمائید لینک

پاسخ‌ها 1

MOHAMAD 11 سال پیش

سلام .

بطور کلی به دو دلیل پروژه آقای 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 موجود در کلاسای دیگه اجرا میشه و قبل اینکه هر دستوری بخواد اجرا بشه فیلد مورد نظر مقدار دهی شده و دیگه ارروری در این مورد ایجاد نخواهد شد.

اینم لینک دانلود فایل تصحیح شده و مرتب شده پروژه
لینک پروژه اصلاح شده

خب از اونجا که من در حال حاضر در حال یادگیری هستم , به این خاطر اطلاعاتم کامل نیست و مسلما امکان داره موردی رو اشتباه توضیح داده باشم ولی تا اینجا و در این مورد پیش اومده بخاطر آموزش خوب جناب آقاجانی تونستم که منبع اررور رو پیدا کنم و برطرفش کنم . در انتها اگر ایرادی در توضیحات بود لطفا به من اطلاع بدید .

نظرات

rad 11 سال پیش
یه دونه ای
MOHAMAD 11 سال پیش
قابلی نداشت . اینکه بتونم عیب یابی کنم از هر چیزی برام لذت بخش تره . خیلی هم تاثیر داره و خیلی هم به آدم واسه ادامه یادگیری انرژی میده به این خاطر که میبینه یادگیریش نتیجه داده . خلاصه کمکی باشه در حد توان انجامش میدم
rad 11 سال پیش
کدی که ویرایش کردی و واسه دانلود گذاشتی با کدی که توضیح دادی فرق میکنه که؟ G.context برای همه هست و G.currentActivity = this برای onResume
MOHAMAD 11 سال پیش
بله درست میگی . اولین فایلی که گذاشتم هم یه روش برای تصحیح خطا بود . اما در فایل دوم که توی همین پست هست . مطابق با توضیحات تغییر کرده . نوشتم پروژه نمایش اکتیوتی لایف سایکل . این فایل رو دانلود کنید
MOHAMAD 11 سال پیش
آقای rad پست رو مجدد مطالعه کنید آپدیتش کردم و لینک پروژه رو هم مجدد آپلود کردم که ایراداتی که داشت رو برطرف کردم .
rad 11 سال پیش
ok ممنون

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .