استفاده بیش از حد از try-catch و چند سوال دیگه
با سلام
پرداخت درون برنامه ای بازار خیلی وقته منو مشغول کرده،اما هنوزم نتونستم درستش کنم، خیلی کرش داره شایدم من خیلی حساس شدم .
من توی صفحه پرداختم بجای دکمه از یه دیالوگ استفاده کردم که از کاربر میپرسم میخاد پرداخت انجام بشه یا نه، اگه تایید بزنه به بازار میره و مشکلی نیست اما اگه کنسل کنه کرش میکنه، و کلا برنامه بسته میشه.
این خطا رو میده :
[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-اصلا دست بردن توی فایلهای بازار کار درستیه؟
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 ی نداره، صفحه تغییر نمیکنه و کاربر حس میکنه هنوز توی لیست مونده. و فقط یه دیالوگ باز میشه که کدهاشو واستون گذاشتم. حالا همینجا اگه کاربر کنسل کنه برنامه کرش میکنه. البته نکته جالبش اینجاست که فقط وقتی به انترنت وصل باشه کرش میکنه. و اگه اینترنت قطع باشه همه چی درست کار میکنه
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .
