رفتن به مطلب
  • 0

مشکل HttpJob


mfg1372

سوال

سلام دوستای عزیز

من تو یه برنامه ای از HttpJob استفاده کردم که یکسری کارها رو از طریق وب و PHP انجام میده و برمیگردونه به برنامه.

مشکل اینجاست که وقتی HTTPJob ارسال میشه و در همون لحظه کاربر اکتیویتی رو ترک میکنه و به صفحه دیگه ای میره جواب HTTPJOB همون لحظه برمیگرده به اکتیویتی جدید و ارور ظاهر میشه و کرش میکنه.

چطور میتونم به محض خروج از اکتیویتی تمامی HTTPJOB های فعلی رو قطع کنم؟از MYHttpJob.Realeas استفاده کردم ولی جواب نداد.ممنون میشم راهنمایی کنید.

سپاس

لینک ارسال
به اشتراک گذاری در سایت های دیگر

10 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

این مشکل بخاطر این رخ میده که موقع Initiolize کردن Me رو ست کردید و مشکلی هم نیست

دوست من یه متغیر به اسم Loading از نوع Boolean بذار و تا زمانی که JobDone رخ نداده اون رو همون True ست کن.

بعد از رخ دادن JobDone اون رو فالس کن و به کلیدی که کاربر با زدن اون به اکتیویتی بعدی میره شرط بذار که اگه Loding=False بود کدهاش رو اجرا کنه.

 

موفق تر باشید

لینک ارسال
به اشتراک گذاری در سایت های دیگر

دوست عزیز شما با Realeas کردن جاب فقط یه فایل تمپ رو حذف میکنین:malih: 

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

این یه مشکل جدی برای این کتابخونه اس و قبلا هم من دیدم که خیلیا این مشکل رو دارن باهاش و متاسفانه هیچ متدی توی کتابخونه برای کنسل کردن وجود نداره مگه اینکه با روشهای ابتکاری این کار رو انجام بدین. شما از سرویس استفاده کنید ببینید چطور میشه. وقتی از اکتیویتی خارج شدید سرویس رو ببندید فک نکنم دیگه اکتیویتی استارت بشه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در 53 دقیقه قبل، محمدرضا شاهپیری گفته است :

دوست عزیز شما با Realeas کردن جاب فقط یه فایل تمپ رو حذف میکنین:malih: 

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

این یه مشکل جدی برای این کتابخونه اس و قبلا هم من دیدم که خیلیا این مشکل رو دارن باهاش و متاسفانه هیچ متدی توی کتابخونه برای کنسل کردن وجود نداره مگه اینکه با روشهای ابتکاری این کار رو انجام بدین. شما از سرویس استفاده کنید ببینید چطور میشه. وقتی از اکتیویتی خارج شدید سرویس رو ببندید فک نکنم دیگه اکتیویتی استارت بشه

بنظرتون با StopService("httputils2service") میشه ببندیم اون سرویس رو ؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خیر عزیز شما زمانی میتونید سرویسی رو ببندید که خودتون اونو استارت کرده باشین. این سرویس توسط کتابخونه استارت میشه و شما هیچ دسترسی به اون ندارید.

من الان تست کردم و کدهای کتابخونه رو توی سرویس نوشتم و وقتی اکتیوتی بسته شد (متد on_pause) سرویس رو هم بستم و به هیچ وجه اکتیویتی استارت نشد

یه مثال میزنم واستون که متوجه بشید

فرض کنیم میخواید یه عکس رو دانلود کنید و وقتی دانلود شد اونو بزارین بکگراند اکتیویتی

کدهای مربوط به سرویس به صورت زیره اسم سرویس هم باشه download مثلا

#Region  Service Attributes 
	#StartAtBoot: False
	
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
Dim okh As HttpJob
End Sub

Sub Service_Create

End Sub

Sub Service_Start (StartingIntent As Intent)
okh.Initialize("job",Me)
okh.Download("http://photos02.wisgoon.com/media/pin/photos02/images/o/2015/11/23/9/500x281_1448259747861261.png")

End Sub
Sub jobdone(job As HttpJob)
 	If job.Success Then
	CallSubDelayed2(Main,"jobdon",job.GetBitmap)
End If
End Sub
Sub Service_Destroy

End Sub

حالا کدهای مربوط به اکتیویتی هم به شکل زیره

#Region  Project Attributes 
	#ApplicationLabel: B4A Example
	#VersionCode: 1
	#VersionName: 
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: unspecified
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: True
#End Region

Sub Process_Globals
	
End Sub

Sub Globals

End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("main")
	StartService(download)
End Sub

Sub Activity_Resume

End Sub

 
Sub Activity_Pause (UserClosed As Boolean)
StopService(download)
End Sub
Sub jobdon(bitmab As Bitmap)
	Activity.SetBackgroundImage(bitmab)
End Sub

چیز خاصی نداره که توضیح بدم فقط اینکه وقتی کار جاب تموم شد از تو سرویس با دستون callsub اومدیم و بکگراند رو تغییر دادیم

الان اگه از اکتیویتی برید بیرون میبینید که به هیچ وجه دیگه اکتیویتی استارت نمیشه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام

اینو امتحان کنید ببینید کنسل میکنه یانه.

ht.Release
StopService(HttpUtils2Service)
CancelScheduledService(HttpUtils2Service)

 

البته در وحله اول روش آقا محمدرضا رو انجام بدید. چون درواقع httpjob رو توی اکتیویتی قرار میدید، Object میشه me یعنی همون اکتیویتی.

ولی توی سرویس دیگه با اون مشکل روبرو نمیشید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ممنون از پاسخگویی همه دوستان . روشها رو تست کردم اما جواب فعلا نگرفتم.بزارید کل مسئله رو باهاتون در میون بزارم.

به گفته ی آقا پژمان عمل کردم و کدهای زیر رو گذاشتم :

ht.Release
StopService(HttpUtils2Service)
CancelScheduledService(HttpUtils2Service)

خب تا اینجا کاربر به صحفه قبل برگرده دیگه اروری ظاهر نمیشه و مشکل تا اینجا حل میشه.

من یه دکمه تو همون صفحه گذاشتم که اگر به هر دلیلی کاربر دچار مشکل شد و HTTPJOB وایستاد و حرکت نکرد ، با این دکمه اکتویتی یبار قطع و دوباره همون اکتیویتی لود بشه.ینی یجورایی رفرش بشه.(activity.finish و  startactivity(me))

با اجرای کد بالا کل سرویس بسته میشه.من میخام سرویس های قبلی در حال اجرا کلا بسته بشه.حالا چه کاربر به یه اکتیویتی دیگه رفته و چه همون اکتیویتی دوباره لود بشه.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ببینید اگه تو اپ از ProgressDialogShow2 استفاده کنید هم خوبه ...

یعنی تا دانلود تموم نشه کاربر نتونه کاری کنه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

برای تمامی اکتیویتی های دیگه اینکارو کردم ولی این یدونه رو بنا به دلایلی نمیتونم.ینی کاربر باید در حین انجام عملیات HTTPJOB کارهای دیگه هم انجام بده

لینک ارسال
به اشتراک گذاری در سایت های دیگر

درود

من نمیفهم برنامتون چیه و چی توی ذهنتون داره میگذره اما کلا بهترین راه میتونه استفاده از یک سرویس باشه و توی اون از HttpJob استفاده کنید

اینجوری توی هر اکتیویتی دیگه هم که برید سرویس کارشو داره انجام میده...

لینک ارسال
به اشتراک گذاری در سایت های دیگر

دوستای گلم سلام.
من با یه ترفندی مشکل رو حل کردم.البته ظاهرا حل شده و اروری نداره.نمیدونم در آینده مشکل ساز میشه یا نه . تو سرویس HTTPULITS2 تو قسمت CompleteJob کد رو به شکل زیر عوض کردم.در واقع یه Try گذاشتم اگه تونستی کد رو انجام بده اگه نه هیچی .. کد هم به شکل زیره :

Sub CompleteJob(TaskId As Int, success As Boolean, errorMessage As String)
    Try
    Dim job As HttpJob = TaskIdToJob.Get(TaskId)
    TaskIdToJob.Remove(TaskId)
    job.success = success
    job.errorMessage = errorMessage
    job.Complete(TaskId)
    Catch
        
    End Try
End Sub

بنظرتون امکان داری مشکلی پیش بیاد؟چون بنظر داره اوکی کار میکنه...

البته این رو هم بگم که از کدهای آقا پژمان هم که زیر هست تو قسمت Activity_Pause استفاده کردم:

StopService(HttpUtils2Service)
CancelScheduledService(HttpUtils2Service)

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...