آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

rad  10 سال پیش  10 سال پیش
+1 0

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

}

+1 0
سلام . لطفا پروژه رو به پست اضافه کنید تا بررسی بشه . (10 سال پیش)
0 0
چطوری؟ (10 سال پیش)
0 0
لینک (10 سال پیش)
+1 0
خب ویدئو مربوط به خروجی گرفتن از رو ببین . داخل بخش یک هست (10 سال پیش)
0 0
متوجه نشدم چی کار کنم؟ (10 سال پیش)
0 0
چی کار کنم؟ (10 سال پیش)
+1 0
لطفا صبر کنید دارم پروژتون رو بررسی میکنم. (10 سال پیش)
+1 0
ایراد رو پیدا کردم . فعلا پروژه رو آپلود میکنم بعدش توضیح میدم . بفرمائید لینک (10 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
MOHAMAD  10 سال پیش
+2 0

سلام .

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

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

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

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

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