با سلام به همه دوستان
من یه برنامه دارم که حدود 50 اکتیویتی از یک xml استفاده میکنند وداخل اون xml از ویجت های(imageview,button)
زیادی استفاده کردم (حدود 25 تا) و این ویجت ها رو در اکتیویتی ها در متد on creat توسط findViewById(R.id........) تعریف کردم
مشکل: برنامم برای ورود به هر اکتیویتی مکث میکنه و کنده و گاهی force close میده ...
آیا علتش مربوط به xml هست؟؟؟
آیا روش بهینه تری وجود داره؟
سلام.
تعداد 25 عنصر در یک فایل xml ، زیاد نیست و مشکلی از این نظر وجود ندارد.
تعداد Activity هایی که از فایل xml استفاده می کنند نیز اهمیتی ندارد. دقت کنید که هر بار، تنها یک Activity در foreground در حال اجرا می باشد و جدا از این نکته، مثلا ما در ساخت یک ListView ، از فایل xml برای تعیین ساختار گرافیکی هر ردیف (row - item) از ListView استفاده می کنیم و بنابراین تعداد ارجاعات به فایل xml ، زیاد است، اما مشکلی به وجود نمی آید.
در مورد کند بودن، باید ببینید که چه بخشی از کدها روند برنامه را کند می کند. بهتر بود کدها را ذکر می کردید (هم کد Activity و هم کدی که برای ورود به Activity در Activity قبلی به کار رفته).
در مورد Force Close ، باید خطایابی کنید و متن خطا را بیابید :
کلید شماره 813
کلید شماره 6968
ممنون از پاسخگویی شما استاد عزیز اینم کدها
ساختار اکتیویتی اول به اینصورته:
کد:
...
public class MainActivity extends Activity implements OnClickListener{
static Button btn1,...;
final Context context = this;
Animation scalebtn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity-main);
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(this);
...
...
btn30.....
}
@Override
public void onClick(View v) {
if (v == btn1){
btn1.startAnimation(scalebtn);
Intent myIntent = new Intent(context, Activity1.class);
startActivityForResult(myIntent, 0);
}
.
.
.
if (v == btn30){
btn30.startAnimation(scalebtn);
Intent myIntent = new Intent(context, Activity30.class);
startActivityForResult(myIntent, 0);
}
}
@Override
protected void onResume() {
super.onResume();
Saveshared.Init(this);
Saveshared.Load();
}
}
و اکتیویتی هایی که توسط زدن کلیدهای اکتیویتی بالا، باز میشن ساختارشون به صورت زیر هست:
کد:
...
public class Activity1 extends Activity implements OnClickListener {
final Context context = this;
Button btn1,...;
ImageView img1,...;
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
img1 = (ImageView) findViewById(R.id.imageView1);
....
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(this);
....
....
}
@Override
public void onClick(View v) {
if (v == btn1){
//some code
}
...
...
}
void saveData() {
SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit();
spe.putInt("sharedKey", i);
spe.commit();
}
void loadData() {
SharedPreferences sp = getPreferences(MODE_PRIVATE);
daryaftseke = sp.getInt("sharedKey", i);
}
@Override
protected void onResume() {
super.onResume();
loadData();
Soundpool.Initsound(this);
Soundpool.soundpool();
}
@Override
public void onPause() {
super.onPause();
Soundpool.soundPool.release();
Soundpool.soundPool = null;
return;
}
}
ممنون از پاسخگویی شما استاد عزیز اینم کدها
ساختار اکتیویتی اول به اینصورته:
کد:
...
public class MainActivity extends Activity implements OnClickListener{
static Button btn1,...;
final Context context = this;
Animation scalebtn;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity-main);
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(this);
...
...
btn30.....
}
@Override
public void onClick(View v) {
if (v == btn1){
btn1.startAnimation(scalebtn);
Intent myIntent = new Intent(context, Activity1.class);
startActivityForResult(myIntent, 0);
finish();
}
.
.
.
if (v == btn30){
btn30.startAnimation(scalebtn);
Intent myIntent = new Intent(context, Activity30.class);
startActivityForResult(myIntent, 0);
finish();
}
}
@Override
protected void onResume() {
super.onResume();
Saveshared.Init(this);
Saveshared.Load();
}
}
و اکتیویتی هایی که توسط زدن کلیدهای اکتیویتی بالا، باز میشن ساختارشون به صورت زیر هست:
کد:
...
public class Activity1 extends Activity implements OnClickListener {
final Context context = this;
Button btn1,...;
ImageView img1,...;
...
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
img1 = (ImageView) findViewById(R.id.imageView1);
....
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(this);
....
....
}
@Override
public void onClick(View v) {
if (v == btn1){
//some code
}
...
...
}
void saveData() {
SharedPreferences.Editor spe = getPreferences(MODE_PRIVATE).edit();
spe.putInt("sharedKey", i);
spe.commit();
}
void loadData() {
SharedPreferences sp = getPreferences(MODE_PRIVATE);
daryaftseke = sp.getInt("sharedKey", i);
}
@Override
protected void onResume() {
super.onResume();
loadData();
Soundpool.Initsound(this);
Soundpool.soundpool();
}
@Override
public void onPause() {
super.onPause();
Soundpool.soundPool.release();
Soundpool.soundPool = null;
return;
}
}
این بخش از کدها را ببینید :
کد پیاچپی:
Intent myIntent = new Intent(context, Activity1.class);
startActivityForResult(myIntent, 0);
شما از روش startActivityForResult برای رفتن به Activity دوم استفاده کرده اید. به جای آن، همان کد معمولی درج شده در کلید زیر را به کار ببرید (استفاده از روش startActivity) :
کلید شماره 2727
ببینید با اعمال این تغییر، مشکل برطرف می شود یا نه.
البته در کل، اگر startActivityForResult را برای دریافت نتیجه از Activity دوم به کار نبرده اید (که احتمالا این طور است، چون روش onActivityResult که برای دریافت نتیجه از Activity دوم و پردازش آن است، در Activity اول نوشته نشده)، توصیه می شود که همان روش startActivity را به کار ببرید. در لینک زیر، یک مثال در مورد روش startActivityForResult وجود دارد تا متوجه شوید که برای چه منظوری به کار می رود :
http://www.javatpoint.com/android-starta...lt-example
------------------------------------------
اگر تغییر مورد نظر را اعمال کردید و مشکل برطرف نشد، توصیه می کنم کدهای روش onResume در Activity دوم را بررسی کنید. ببینید مثلا با حذف آنها، مشکل برطرف می شود یا خیر.
هر موردی که مشکل مربوط به آن است را با AsyncTask اجرا نمایید.
------------------------------------------
در ارسال دوم که دوباره کدها را ذکر کرده بودید، مشاهده کردم که کد زیر نیز نوشته شده است :
که برای بسته شدن Activity به صورت کامل (destroy شدن آن) به کار می رود. توصیه می شود، این کد را حذف کرده و آن را در روش onPause بنویسید. به کار رفتن آن، دقیقا بعد از کد رفتن به Activity بعدی، گاهی مشکلاتی را ایجاد می کند.
دلیل نوشتن آن در روش onPause این است که چون به Activity بعدی می رویم، پس در Activity فعلی، روش onPause اجرا می شود و بنابراین با اجرای کد بالا، Activity به صورت کامل بسته می شود و به background نخواهد رفت. در این زمینه،
کلید شماره 230 را بخوانید.
ممنون از راهنمایی شما نکات بسیار مفیدی بود و اعمال کردم:
اما با بررسی دقیق تر متد on creat با استفاده از log و بدست آوردن زمان ، متوجه شدم کد :
کد:
setContentView(R.layout.ly);
بیشترین زمان رو صرف میکنه (حدود 1700ms) .
این یعنی مشکل از ساختار لایه ها و ویدجت های فایل xmlهست؟
(بوسیله Heirarchy viewer هم برنامه رو چک کردم دو سه تا از ویدجت ها draw time node قرمز نشون میده ولی هیچ جا نگفته چطور باید برطرف کرد)
با تشکر
کدهای فایل xml را نیز ذکر کنید.