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

اختصاص حافظه بیشتر به برنامه با کد در مانیفست


arastooms

سوال

سلام به همه بزرگان و اساتید و اعضا 
ساخت برنامه ای رو تجربه میکنم که 5 تا فایل mp3 رو قرار داشته باشه و خیلی ساده پخش کنه
فایلها حجم بالایی دارن ( بالاتر از 40 مگابایت ) به دلیل اینکه موزیک مدیتیشن هست و هر کدوم 30 دقیقه تا یک ساعت زمانش هست
همه چیز مرتبه و فایلها اجرا میشه و همه چیز خوبه 
---------------------
برای اینکه همکاران (کلاه سیاه) موزیک ها رو به سادگی از توی فایل سورس بر ندارند اومدم یک ترفند کوچک زدم 

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

حالا اومدم تو بیسیک و قصد دارم وقتی فایل رو کپی میکنیم بایتش رو هم به صورت اول در بیارم  که قابل استفاده باشه (( برای برنامه خودم ))
در این کار هم موفق هست در ورژن بالای اندروید مثلا api 19 به بالا و مشکلی نداره ولی در (( در api 16 و api های پاین اندروید )) 
به فایل های سنگین میرسه...........

 که فایلهای mp3 که بالای 10 مگابایت هست رو اررور میده و از برنامه خارج میشه 
و مینویسه 

** Service (starter) Create **
** Service (starter) Start **
** Activity (main) Create, isFirst = true **
//======================//
شروع برنامه
//======================//
 File.DirInternal کنترل وجود فایل در 
//======================//
شروع تغیر فایل به بایت
filedata_file2byte (java line: 68)
java.lang.OutOfMemoryError
	at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
	at anywheresoftware.b4a.objects.streams.File.Copy2(File.java:357)
	at b4a.example.filedata._file2byte(filedata.java:68)
	at b4a.example.main._activity_create(main.java:363)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:511)
	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
	at b4a.example.main.afterFirstLayout(main.java:102)
	at b4a.example.main.access$000(main.java:17)
	at b4a.example.main$WaitForLayout.run(main.java:80)
	at android.os.Handler.handleCallback(Handler.java:615)
	at android.os.Handler.dispatchMessage(Handler.java:92)
	at android.os.Looper.loop(Looper.java:137)
	at android.app.ActivityThread.main(ActivityThread.java:4745)
	at java.lang.reflect.Method.invokeNative(Native Method)
	at java.lang.reflect.Method.invoke(Method.java:511)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
	at dalvik.system.NativeStart.main(Native Method)

 

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

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

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

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

در ۱ ساعت قبل، MahdiHD گفته است :

سلام ، این روشی که شما انتخاب کردید خب بر روی گوشی های که سخت افزار ضعیفی دارند با مشکل‌ مواجه می شه. شما دو راه دارید :

 

۱- استفاده از doEvent که روش غیر استانداری هست و پیشنهاد نمی کنم ، این کد باعث ایجاد یک وقف چند میلی ثانیه ای می شه و به CPU این فرمان رو می ده که بدون در نظر گرفتن الگوریتم های خودش ، وظایف برنامه ما رو انجام بده. باید چند بار پشت سر هم این دستور رو بزاری.

 

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

سلام ممکنه دستور doevent رو کمی توضیح بدید یا اگر کدی داره بفرمایید چه طور استفاده کنم؟
و اینکه در راه حلدوم چه طور باید مثلا یک فایل mp3  یک ساعتی با حجم بالا رو به 5 قسمت تقسیم کنم و بعد تو برنامه بگم یکیکنه و بریزه تو پوشه فایل برنامه؟؟

 

در 19 ساعت قبل، mohammad-alone گفته است :

تو فرآیند این برنامه ای که نوشتید DP رخ میده و برنامه کرش میشه.

بنظرم فایلهاتون رو Split کنید

 

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

سلام

من با روش خودتون زیاد کاری ندارم

میتونید فایل هاتون رو توی زیپ و با پسورد قرار بدید و بعد از اجرا شدن برنامه در اولین بار، Extract رو انجام بدید و کپی خودتون رو هم بکنید :fekr:

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

در ضمن من خودم شخصا برای برنامه هایی که فایل های mp3 با زمان زیاد مینویسم از پسوند ogg و کیفیت مثلا 32 بیت استفاده میکنم

تست کنید... زیاد تاثیری نداره روی کیفیت برای گوشی...

حجم برنامتون خیلی خیلی پایین تر میاد

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

روش زیپ به چه صورت مهدی جان ؟؟
و اینکه روی همه api جواب میده ؟؟

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

فایل Zip رو به Assets میدی دیگه !

تا جایی که اطلاع دارم آره جواب میده و مشکل خاصی نداره روی API های مختلف

من خودم از AriaZip استفاده کردم چند باری... با بقیه کتابخانه های این ضمینه کار نکردم

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

ضمن تشکر از همه دوستان 
من کد رو به صورت خلاصه اینجا قرار میدم به دو دلیل 
هم نومنه سورس خوبی هست برای تغیر بایت یک فایل در b4a که دوستان می تونن استفاده کنن
هم اگر عزیزی هست که بتونه این مشکل رو برطرف کنه و من رو راهنمایی کنه ممنون میشم
////////////////////////////
سورس کد تغیر بایت برای هر نوع فایل در بیسیک

کاربرد : پنهان کردن و غیر قابل دست رس کردن فایلها در پوشه برنامه توسط کامپایل

کارکرد:
فایلی رو معرفی میکنید
فایل رو به بایت تغیر میده 
و بایت هایی رو که دوست دارید تغیر میده
و به اسمی که دوست دارید ذخیره میکنه
دقت کنید که دیگه این فایل قابل استفاده نیست مگر این که 
(( در برنامه خودتون در قسمت کد نویسی وقتی فایل رو باز خانی میکنید بیاید و اون بایت هایی رو که تغیر دادید به روز اول برگردونید))
در واقع این سورس قسمت کد کردن اطلاعات به روش تغیر بایت هست ))

مشکل سورس کد 
برای api پایین 16 کار نمیکنه و حافظه کم میاره 
و فایل بالاتر از 10 مگابایت رو نمیتونه باز کنه و به بایت تبدیل کنه تا بتونه روی بایت های مورد نظر تغیر ایجاد کنه 

ولی در api 16 به بالا بسیار خوب عمل میکنه و تا 40 مگابایت رو هم میتونه تغیر بایت بده (( من تست کردم))


درخواست من برای رفع مشکل " عزیزان اگر استاد و دوستی هست که بتونه این این مشکل کمبود حافظه رو در ورژن های پایین حل کنهه ممنون میشم"

 


		Log("wwwww شروع تغیر فایل به بایت")
		Log("----------------------------------------")
	Dim b1() As Byte
	b1 = FileData.File2Byte(File.DirInternal ,name_file)
	Log("فایل به بایت تبدیل شد ")
	
		Log("----------------------------------------")
		
	Log("شروع تغیرات 2 بایت 0 و 1")
	b1(0) = b1(0) +5
	Log("شروع تغیرات بایت اول b1(0) +5")
	
		Log("----------------------------------------")
		
	b1(1) = b1(1) +10
	Log(" تغیرات بایت انجام شدb1(1) +10")
	
		Log("----------------------------------------")
		
	Log("شروع تغیر Byte2File")
	FileData.Byte2File(b1,File.DirInternal ,name_file&"_byte_change_ok")
	Log("فایل تغیر بایت داده شده با موفقیت تغیر یافت")
'♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥♥
Log("//♥♥♥♥♥♥♥♥♥♥♥ end ♥♥♥♥♥♥♥♥♥♥♥♥//")

و این هم کد قسمت تغیر بایت

 

'Code module
'Subs in this code module will be accessible from all modules.
Sub Process_Globals

End Sub
Sub File2Byte(Dir As String,Filename As String) As Byte()
	
Dim input  As InputStream
Dim output As OutputStream
Dim buff() As Byte
 input = File.OpenInput(Dir,Filename)
 output.InitializeToBytesArray(100000)
 File.Copy2(input,output)
 buff = output.ToBytesArray
 output.Close
Return buff

End Sub
Sub Byte2Image(buffer() As Byte) As Bitmap
	
Dim b1 As Bitmap
Dim input As InputStream
 input.InitializeFromBytesArray(buffer,0,buffer.Length)
 b1.Initialize2(input)
 input.Close
 Return b1
 
End Sub
Sub Byte2File(Buffer() As Byte,Dir As String,Filename As String) As Boolean
Dim output As OutputStream
 output = File.OpenOutput(Dir,Filename,False)
 output.WriteBytes(Buffer,0,Buffer.Length)
 output.Close
 Return True
End Sub

 

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

در حال حاضر فعلا این کد یادمه :blush:

SetApplicationAttribute(android:largeHeap,"true")

تو مانیفست اضافه کن ببین بهتر میشه 

یه چیزی چرا از ترد استفاده نمیکنی ؟

البته اگر نظر آخر منو بخای همون کاری آقا ایزدی گفتن خوبه 

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

در در 1395/06/19, 12:50:24، arastooms گفته است :

سلام ممکنه دستور doevent رو کمی توضیح بدید یا اگر کدی داره بفرمایید چه طور استفاده کنم؟
و اینکه در راه حلدوم چه طور باید مثلا یک فایل mp3  یک ساعتی با حجم بالا رو به 5 قسمت تقسیم کنم و بعد تو برنامه بگم یکیکنه و بریزه تو پوشه فایل برنامه؟؟

 

 

عزیزم قرار نیست یکی کنه.

همینکه بعد از اتمام فایل 1 آتوماتیک بره و فایل 1-1 رو بخونه کافیه

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

این هم فایل آپلود کردم که اگر دوست دارید ببینید 
 

http://s7.picofile.com/file/8266693868/test_arastoo.zip.html

http://s7.picofile.com/file/8266693868/test_arastoo.zip.html

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

در 9 دقیقه قبل، dftbayat گفته است :

در حال حاضر فعلا این کد یادمه :blush:


SetApplicationAttribute(android:largeHeap,"true")

تو مانیفست اضافه کن ببین بهتر میشه 

یه چیزی چرا از ترد استفاده نمیکنی ؟

البته اگر نظر آخر منو بخای همون کاری آقا ایزدی گفتن خوبه 

سلام 
مرسی از پاسخ 
این گزینه رو در مانی فست ایجاد کردم 
تا قبل از این گزینه روی api های 16 و 18 هم مشکل داشت که وقتی این رو اضافه کردم برای اون نسخه ها خوب شد 
ولی هنوز برای api پایین 16 کار نمیکنه و فورس کلوز میده 

در باره مبحث ترد " رشته " هم از کتابخونه آقای شاهدی استفاده کردم که با همین خطا در ترد مواجه میشم 
و فکر میکنم هم درسته که خطا بده !!
چون فرقی نمیکنه اگر هم در ترد جدا اجرا بشه این دستگاهه که با حافظه مشکل داره و نمیکشه !!! چه تو برنامه و چه خارج برنامه و در ترد جدا به مشکل برخورد میکنه و میگه حافظه کمه 

 

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

در در 1395/06/19, 12:50:24، arastooms گفته است :

سلام ممکنه دستور doevent رو کمی توضیح بدید یا اگر کدی داره بفرمایید چه طور استفاده کنم؟
و اینکه در راه حلدوم چه طور باید مثلا یک فایل mp3  یک ساعتی با حجم بالا رو به 5 قسمت تقسیم کنم و بعد تو برنامه بگم یکیکنه و بریزه تو پوشه فایل برنامه؟؟

 

 

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

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

تو فرآیند این برنامه ای که نوشتید DP رخ میده و برنامه کرش میشه.

بنظرم فایلهاتون رو Split کنید

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

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

میدونید دوستان این متد خیلی بدرد نمیخوره چراکه وقتی از DoEvent تو اپ بهره میبرید برنامه وقتی که داره لود میکنه لگ میزنه و حس بدی رو به UX میده !

 

موفق تر باشید

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

در 8 دقیقه قبل، mohammad-alone گفته است :

تو فرآیند این برنامه ای که نوشتید DP رخ میده و برنامه کرش میشه.

بنظرم فایلهاتون رو Split کنید

مهندس جان متاسفانه متوجه اصطلاحات نشدم (( بنده مبتدی تر از این حرفا و اصطلاحاتم :fekr:))
ممکنه لطف کنید و محبت بفرمایید هر دو اصطلاحی که به کار بردید رو کمی شرح بدید
ممنون میشم راهنمایی بفرمایید 
تشکر

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

در 18 ساعت قبل، arastooms گفته است :

مهندس جان متاسفانه متوجه اصطلاحات نشدم (( بنده مبتدی تر از این حرفا و اصطلاحاتم :fekr:))
ممکنه لطف کنید و محبت بفرمایید هر دو اصطلاحی که به کار بردید رو کمی شرح بدید
ممنون میشم راهنمایی بفرمایید 
تشکر

سلام ، این روشی که شما انتخاب کردید خب بر روی گوشی های که سخت افزار ضعیفی دارند با مشکل‌ مواجه می شه. شما دو راه دارید :

 

۱- استفاده از doEvent که روش غیر استانداری هست و پیشنهاد نمی کنم ، این کد باعث ایجاد یک وقف چند میلی ثانیه ای می شه و به CPU این فرمان رو می ده که بدون در نظر گرفتن الگوریتم های خودش ، وظایف برنامه ما رو انجام بده. باید چند بار پشت سر هم این دستور رو بزاری.

 

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

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

بایگانی شده

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

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

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