View Full Version : استفاده از try-catch های متعدد؟
reza_azizi2010
دوشنبه 02 تیر 1393, 21:50 عصر
با سلام
پرداخت درون برنامه ای بازار خیلی وقته منو مشغول کرده،اما هنوزم نتونستم درستش کنم، خیلی کرش داره شایدم من خیلی حساس شدم .
من توی صفحه پرداختم بجای دکمه از یه دیالوگ استفاده کردم که از کاربر میپرسم میخاد پرداخت انجام بشه یا نه، اگه تایید بزنه به بازار میره و مشکلی نیست اما اگه کنسل کنه کرش میکنه، و کلا برنامه بسته میشه.
این خطا رو میده :
06-23 22:14:00.402: E/AndroidRuntime(1719): FATAL EXCEPTION: Thread-144
و چند تا خط از فایل IabHelper (یکی از فایلهایی که توی پوشه util قرار داره) رو نشون میده. ازونجایی که این فایل بسیار خفنه و من هیچی نمیفهمم! اومدم همه اون خطهایی که خطا رخ داده بود رو یکی یه دونه try-catch گذاشتم! بنظرم خودم غیر اصولیه اما حداقلش اینه دیگه کرش نمیکنه.
حالا سوالم اینجاست،
1-کسی میدونه مشکل چطور رفع میشه ، منظورم بدون استفاده از try-catch ؟
2- این همه try-catch مشکلی پیش نمیاره؟
3-اصلا دست بردن توی فایلهای بازار کار درستیه؟
poorman
سه شنبه 03 تیر 1393, 00:36 صبح
ارتباط با بازار رو کی فعال میکنید؟
وقتی دیالوگ باز میشه ارتباط با بازار رو هم برقرار میکنید؟
احتمال داره مشکل از اینجا باشه
بهتره وقتی روی بله کلیک کرد ارتباط با بازار برقرار بشه
این کدی هست که وقتی میخواین از اکتیویتی پرداخت بیاید بیرون، باید توی onDestroy بنویسید
try { if (mHelper != null) {
mHelper.dispose();
mHelper = null;
}
} catch (Exception e) {
}
امتحان کنید وقتی دیالوگ بسته میشه این کد رو هم اجرا کنید، شاید مشکل از اینه
try/catch گذاشتن زیاد ایرادی نداره، کار رو واسه خطایابی خیلی ساده میکنه
ولی خب باید هوشمندانه باشه و همه شرایط خطا رو در نظر بگیرید که اگر یک کد اجرا نشد، در عوض چه چیزی انجام بشه
دست بردن توی کدهای پرداخت بازار هم فکر نمیکنم درست باشه !!!
چون خود بازار توی مستندات نوشته اونا 2 تا خط از پرداخت درون برنامه ای گوگل پلی رو تغییر دادن و شده پرداخت درون برنامه ای بازار :قهقهه:
وقتی اونا نتونستن دست ببرن، پس شما زیاد به خودتون زحمت ندین
reza_azizi2010
سه شنبه 03 تیر 1393, 10:10 صبح
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 ی نداره، صفحه تغییر نمیکنه و کاربر حس میکنه هنوز توی لیست مونده. و فقط یه دیالوگ باز میشه که کدهاشو واستون گذاشتم. حالا همینجا اگه کاربر کنسل کنه برنامه کرش میکنه. البته نکته جالبش اینجاست که فقط وقتی به انترنت وصل باشه کرش میکنه. و اگه اینترنت قطع باشه همه چی درست کار میکنه
poorman
سه شنبه 03 تیر 1393, 13:20 عصر
مشکل کد شما از این خط هست توی فعال سازی پرداخت onCreate
mHelper.queryInventoryAsync(mGotInventoryListener) ;
این خط رو پاک کنید، توی خرید این خط نیازی نیست
با این خط کد و تابعی که صدا زده میشه، یک گزارش از لیست کالا ها از بازار گرفته میشه که آیا کاربر این محصول رو خرید کرده یا نه ( برای این کار باید کدهاتون رو توی تابعی که صدا زده میشه بنویسید )
از اونجایی که اینجا صفحه خرید هست، و شما فکر نمیکنم کاری توی اون تابع انجام بدین، این خط رو پاک کنید
این تابع برای وصل شدن به سرور بازار حدود 20-30 ثانیه زمان میبره و مسلما وقتی شما اکتیویتی رو finish میکنید کار این تابع نا تموم هست و کرش میکنه
reza_azizi2010
سه شنبه 03 تیر 1393, 19:17 عصر
یعنی لگه این خط رو حذف کنم، مشکلی برای کاربران پیش نمیاد؟ مثلا ینفر برنامه رو بخره و بعد حذفش کنه. و اگه دوباره بخاد نصب کنه مجبور میشه دوباره پرداخت انجام بده یا نه؟
poorman
سه شنبه 03 تیر 1393, 21:56 عصر
گفتم که این کد فقط یک گزارش میگیره از سرور بازار که حدود 20-30 ثانیه طول میکشه
این گزارش گرفتن در حالت عادی هیچ کاری نمیکنه، شما باید توی تابع گزارش گیری کد بنویسید که اگر این جنس خریده شده چی بشه
اما به هر حال این کد متعلق به صفحه خرید نیست، اصلا اینجا لازم نیست و به درد نمیخوره چون خیلی طول میکشه
این کد رو باید توی یک دکمه مثلا با عنوان "قبلا خرید کرده ام" بذارید
بعد اونجا باید توی تابع گزارش گیری، بگید اگر فلان محصول خریداری شده، برنامه رو فعال کن
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.