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

استفاده بیش از حد از try-catch و چند سوال دیگه

مدیریت گفتگو
Reza AF 12 سال پیش
آخرین تغییر: 12 سال پیش

با سلام
پرداخت درون برنامه ای بازار خیلی وقته منو مشغول کرده،اما هنوزم نتونستم درستش کنم، خیلی کرش داره شایدم من خیلی حساس شدم .
من توی صفحه پرداختم بجای دکمه از یه دیالوگ استفاده کردم که از کاربر میپرسم میخاد پرداخت انجام بشه یا نه، اگه تایید بزنه به بازار میره و مشکلی نیست اما اگه کنسل کنه کرش میکنه، و کلا برنامه بسته میشه.
این خطا رو میده :
[XML]
06-23 22:14:00.402: E/AndroidRuntime(1719): FATAL EXCEPTION: Thread-144

[/XML]
و چند تا خط از فایل IabHelper (یکی از فایلهایی که توی پوشه util قرار داره) رو نشون میده. ازونجایی که این فایل بسیار خفنه و من هیچی ازش نمیفهمم! اومدم همه اون خطهایی که خطا رخ داده بود رو یکی یه دونه try-catch  گذاشتم! بنظرم خودم غیر اصولیه اما حداقلش اینه دیگه کرش نمیکنه.
حالا سوالم اینجاست،
1-کسی میدونه مشکل چطور رفع میشه ، منظورم بدون استفاده از try-catch ؟
2- این همه try-catch  مشکلی پیش نمیاره؟
3-اصلا دست بردن توی فایلهای بازار کار درستیه؟

نظرات

hamidd 12 سال پیش
بهتره تا میتونید از try-catch استفاده نکنید جاهایی که لازم بوده خودشون گذاشتن.این فایل ها رو بازار دقیقا از سورسی که گوگل پلی گذاشته، کپی کرده (فقط دو تا خط شو تغییر داده).اگه احتیاج بشه باید دست توی این فایلها برد.باز شدن و کنسل شدن دیالوگ نباید باعث کرش برنامه بشه .این همه try-catch مشکل پیش میاره.اگه ندونید فلان خط کد چه کاری رو انجام میده نباید براش try-catch بذارید.
amir Alu 12 سال پیش
من هم در یکی از برنامه هام دقیقا همین کار را انجام دادم ولی کرش نکرده. بهتر هست کدت بزاری تا بررسی بشه
amir Alu 12 سال پیش
من هم در یکی از برنامه هام دقیقا همین کار را انجام دادم ولی کرش نکرده. بهتر هست کدت بزاری تا بررسی بشه
مجتبی یگانه 12 سال پیش
استفاده از try catch ضرری نداره ، هر وقت احساس کردید ممکنه خطایی اتفاق بیافته باید مدیریت Handle بشه ، اما در مورد بازار و سورس کدش ، بازار سورس کد های تک خطی برای فراخوانی داده ، سورس کد کامل نیست ، قطعا به Catch کردن خطا نیاز داره
hamidd 12 سال پیش
من پرداخت درون برنامه ای توی برنامم پیاده سازی کردم هیچ crach ای رخ نمیده.مثل ساعت هم کار می کنه.هیچ try catch ای هم بهش اضافه نکردم.ولی همون طور که عرض کردم اگه احتیاج بشه باید دست توی این فایلها برد و try catch اضافه کرد. ولی تا ندونید اون خط کدی که باعث خطا شده کارش چی هست اگه براش try catch اضافه کنید فقط جلوی کرش کردن برنامه رو میگیرید ولی باعث ایجاد خطا در جاهای دیگر برنامه میشه و مجبورید باز هم try catch اضافه کنید.دقیقا مثل همین کاری که شما کردید.
Reza AF 12 سال پیش
من نمیدونم شما چطور خطا نمیگیرید؟ الان حتی مثال بازار هم در شرایطی کرش داره! خوش بحال شما
hamidd 12 سال پیش
خود مثالش که چند تا خطا داره.یکیش اینه که اگه بازار نصب نباشه کرش میکنه.باید برطرف شون کنید.
hamidd 12 سال پیش
برای منم کرش می داد.خطاهاشو برطرف کردم ولی try catch نذاشتم.
مجتبی یگانه 12 سال پیش
نه منظور ما اضافه کردن try catch در کتابخانه و فایل های inAppBilling بازار نیست ، منظورمون تو فراخوانی متد ها هست
hamidd 12 سال پیش
ok مجتبی جان. ولی ایشون نوشته که برای تمام خطاهایی که توی فایل IabHelper (یکی از فایلهایی که توی پوشه util قرار داره) وجود داره ،try-catch گذاشته. فایل IabHelper یکی از فایلهای inAppBilling بازار هست.
مجتبی یگانه 12 سال پیش
اوه اوه ! ، نیازی نیست رضا جان ، کارتون خیلی گره می خوره

پاسخ‌ها 2

Reza AF 12 سال پیش


  protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//**************************** ghesmate on create pardakht **********************
String base64EncodedPublicKey = "...";

mHelper = new IabHelper(this, base64EncodedPublicKey);

Log.d(TAG, "Starting setup.");
try {
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {

public void onIabSetupFinished(IabResult result) {
Log.d(TAG, "Setup finished.");

if ( !result.isSuccess()) {
// Oh noes, there was a problem.
Log.d(TAG, "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
mHelper.queryInventoryAsync(mGotInventoryListener);
}
});
}
catch (Exception ee) {}

pardakht_dialog();

}

این کد صفحه پرداخته، که دقیقا همون کد بازاره فقط یه دیالوگ اضافه شده. فراخوانی خرید هم از طریق همین دیالوگه.

البته یه try-catch خودم اضافه کردم.

این هم کد دیالوگ :

 
private void pardakht_dialog() {
final Dialog mydialog = new Dialog(Pardakht.this);

mydialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
mydialog.setContentView(R.layout.pardakht_popup);
Button pardakht = (Button) mydialog.findViewById(R.id.btn_pardakht_ok);
Button cancel = (Button) mydialog.findViewById(R.id.btn_pardakht_cancel);
mydialog.show();
pardakht.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
try {
mHelper.launchPurchaseFlow(Pardakht.this, SKU_PREMIUM, RC_REQUEST, purchaseFinishedListener);
}
catch (Exception e) {
Toast.makeText(G.context,"Err", Toast.LENGTH_LONG).show();
}
}
});

cancel.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
try {
mydialog.dismiss();
if (mHelper != null) {
mHelper.dispose();
}

mHelper = null;
Pardakht.this.finish();
}
catch (Exception e) {

}

}
});



من میخاستم وقتی کاربر روی یک ایتم لیست کلیک کرد همونجا پنجره پرداخت باز بشه و نیازی نباشه بره یه صفحه دیگه و اونجا دکمه پرداخت رو بزنه. واسه همین اکتیویتی پرداختم رو بدون فایل xml ساختم ، یعنی بهش layout اختصاص ندادم. و فقط یه دیالوگ توش گذاشتم. وقتی کاربر روی لیست کلیک میکنه اکتیوتی پرداخت فراخوانی میشه ولی چون هیچ layout ی نداره، صفحه تغییر نمیکنه و کاربر حس میکنه هنوز توی لیست مونده. و فقط یه دیالوگ باز میشه که کدهاشو واستون گذاشتم. حالا همینجا اگه کاربر کنسل کنه برنامه کرش میکنه. البته نکته جالبش اینجاست که فقط وقتی به انترنت وصل باشه کرش میکنه. و اگه اینترنت قطع باشه همه چی درست کار میکنه

 

 

نظرات

hamidd 12 سال پیش
روی کدوم خط کرش می کنه؟ لطفا خطای logcat رو بزارید.
hamidd 12 سال پیش
اگه توی رویداد cancel فقط کد mydialog.dismiss(); رو بزارید باید کار کنه.دیگه نیازی به اون کدها نیست.شما قبل از نمایش دیالوگ به mHelper کاری نداشتید که بخواهید موقع cancel شدن دیالوگ مقدارش رو null بزارید یا هر کار دیگه ای روش انجام بدید.
Reza AF 12 سال پیش

همچنان امیدوار به تایید!

نظرات

Reza AF 12 سال پیش
من و بازار ! یه روز آفتابی
Reza AF 12 سال پیش
دست رو دلم نذار
CreativeBoy 12 سال پیش
هه چه آفتاب بدی :). A.L.U به چه چیزایی فکر میکنیاا :)

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