ออกแบบสำหรับการซิงค์ข้อมูลใน Android


23

ฉันเห็นการปรับใช้สองแบบสำหรับการซิงค์ข้อมูลระหว่างเซิร์ฟเวอร์และไคลเอนต์ในแอปส่วนใหญ่ สิ่งนี้ถือว่าไม่มีการตั้งค่า GCM: -

  1. เรียกใช้บริการเจตนาเป็นระยะ ๆ ซึ่งจะดาวน์โหลดข้อมูลจากเครือข่ายและจัดเก็บในฐานข้อมูล
  2. การนำ Sync Adapter มาใช้ซึ่งทำงานเป็นระยะ

คุณแนะนำให้ใช้ข้อใดข้างต้นในแอพของคุณและเพราะเหตุใด

คำตอบ:


12

หมายเหตุ: ซิงค์อะแดปเตอร์ทำงานแบบอะซิงโครนัสดังนั้นคุณควรใช้อะแดปเตอร์เหล่านั้นด้วยความคาดหวังว่าอุปกรณ์จะถ่ายโอนข้อมูลอย่างสม่ำเสมอและมีประสิทธิภาพ แต่ไม่ทันที หากคุณต้องการถ่ายโอนข้อมูลแบบเรียลไทม์คุณควรทำใน AsyncTask หรือ IntentService - แหล่งที่มา

โดยทั่วไปหากคุณต้องการถ่ายโอนตามเวลาจริงให้ใช้ IntentService (ตัวเลือกแรก) หรือ SyncAdapter อื่น ฉันชอบ IntentService เพราะมันให้ความรู้สึกที่ปรับแต่งได้มากกว่า แต่วิธีที่น่าสนใจมากกว่านั้นก็คือการใช้ SyncAdapter


18

มันขึ้นอยู่กับว่าคุณต้องการซิงค์ชนิดใด

เป็นระยะ

หากแอปของคุณเป็นแอปข่าวที่เผยแพร่โพสต์ในบางช่วงเวลาทุกวัน (ให้บอกเวลา 7.45 น. ทุกวัน) แสดงว่าคุณทำงานเป็นระยะในบริการแบ็คกราวน์พูดตอน 8 โมงเช้า

เช่น Drippler พวกเขาแจ้งฉันทุกวัน (ประมาณ 18.30 น.) ฉันเชื่อว่าพวกเขาใช้งานเป็นระยะ

เหตุการณ์ถูกเรียก

หากการถ่ายโอนข้อมูลของคุณถูกกระตุ้นโดยการกระทำของผู้ใช้ให้ใช้บริการพื้นหลังหรือ AsyncTask สำหรับการถ่ายโอนข้อมูล

เช่น DropBox / Evernote พวกเขาซิงค์เมื่อฉันโต้ตอบกับแอพ

ทันทีทันใด

หากแอปของคุณรันการส่งข้อความทันที / อีเมล / การอัปเดตที่สำคัญเป็นระยะ ๆคุณต้องมีการแจ้งเตือนแบบพุชเพราะคุณต้องการเตือนผู้ใช้ทันที ใช้ GCM หรือแยกวิเคราะห์สำหรับกรณีนี้ เช่น: WhatsApp / Google chat เนื่องจากคุณพูดอย่างชัดเจนว่าคุณไม่ต้องการใช้ GCM ฉันจะบอกว่าทำไมคุณควรใช้ผู้ให้บริการแจ้งเตือนแบบพุชแบบมาตรฐานแทนการเขียนของคุณเอง:

การแจ้งเตือนแบบพุชใช้งานได้ทันที - มีความล่าช้าเล็กน้อย (ตามลำดับวินาทีไม่กี่นาที) หากคุณต้องใช้โซลูชัน / ไลบรารีของคุณเองสำหรับการทำสิ่งนี้ - ในรูปแบบไร้เดียงสาคุณจะ ping เซิร์ฟเวอร์ทุกวินาทีหรือ 5 วินาทีหรือหนึ่งนาทีเพื่อตรวจสอบสถานะ สิ่งนี้ไม่มีประสิทธิภาพมากเนื่องจากใช้ CPU (และด้วยแบตเตอรี่) แบนด์วิดท์บนมือถือและโหลดบนเซิร์ฟเวอร์ของคุณ อย่างไรก็ตามใน GCM / Parse พวกเขาจะเปิดพอร์ตเสมอกับเซิร์ฟเวอร์ (ดูที่นี่ ) นี่คือวิธีมาตรฐานและมีประสิทธิภาพมากที่สุด นอกจากนี้หากแอป 10 แห่งใช้ GCM คุณไม่จำเป็นต้องมีการเชื่อมต่อแบบเปิด 10 รายการคุณจะต้องใช้เพียงหนึ่งเครื่องต่อหนึ่งอุปกรณ์ และคุณไม่ต้องการพัฒนาโซลูชันของคุณเองนอกเสียจากคุณจะมีเหตุผล / เงิน / เวลาที่ถูกต้อง

หมายเหตุเกี่ยวกับ Sync Adapter : Sync Adapter ทำงานได้ดีสำหรับทั้งสามกรณีข้างต้น ทำเครื่องหมายเรียกใช้ซิงค์อะแดปเตอร์แล้วคุณจะเห็นว่าขึ้นอยู่กับ GCM หรือกลไกของคุณเอง (ทริกเกอร์เหตุการณ์หรือโซลูชันที่กำหนดเอง) หรือความพร้อมเครือข่าย (ทริกเกอร์เหตุการณ์) หรือเหตุการณ์เป็นระยะ โดยรวมแล้วนี่เป็นคลาสที่สะดวกสบายสำหรับการซิงค์ข้อมูลโดยไม่ต้องทำรายการเริ่มต้นจำนวนมากทุกครั้งหรือใช้กรณีข้างต้นทั้งหมดในที่เดียว


ในฐานะที่เป็นคำถามเพิ่มเติมหากฉันจำเป็นต้องอัปเดตคะแนนสดของการแข่งขันสถานการณ์สมมตินั้นเป็นสถานการณ์ที่เหมาะสมสำหรับบริบทนี้หรือไม่ ฉันมีหน้าจอที่มีรายละเอียดการจับคู่และในขณะที่ผู้ใช้อยู่บนหน้าจอนั้นคะแนนควรได้รับการอัปเดตโดยอัตโนมัติโดยไม่ต้องซิงค์หรืออัปเดตด้วยตนเอง ดังนั้นจีเอ็มซีจะเป็นก้าวที่ถูกต้องไปข้างหน้า?
gaara87

@AkashRamani ฉันไม่เห็นเหตุผลที่คุณไม่ควรใช้ GCM / Parse สำหรับกรณีนี้ อย่างไรก็ตาม GCM นั้นฟรีในขณะที่ Parse เรียกเก็บเงินคุณเกินกว่าที่กำหนด หากการอัพเดตของคุณมีขนาดไม่เกิน 4096 ไบต์คุณสามารถส่งการอัปเดตได้โดยตรง หากการอัปเดตคะแนนของคุณบ่อยมากการสำรวจอาจเป็นความคิดที่ดีแทน GCM (พูดสำหรับคะแนนคริกเกต) ฉันขอแนะนำให้ทดสอบ / โปรไฟล์ทั้งโพลและ GCM สำหรับเวลาแฝงและการใช้ CPU / แบตเตอรี่
Sundeep

AWS ยังมีโซลูชันการแจ้งเตือนที่เป็นข้ามแพลตฟอร์มและข้ามตลาด โปรดดู: docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html
Brill Pappin

3

มีแง่มุมหนึ่งของSyncAdapterคำตอบอื่น ๆ ที่ไม่ได้กล่าวถึง

SyncAdapterรูปแบบที่คุณต้องมีที่เฉพาะเจาะจงContentProviderอำนาจที่คุณซิงค์กับบัญชีและประเภทที่เฉพาะเจาะจง (ดูAuthenticator ) ที่จะได้รับการซิงค์ ดังนั้นหากคุณไม่มีส่วนประกอบเหล่านั้นในสถาปัตยกรรมของคุณ (เช่นเนื่องจากคุณให้แอปอื่น ๆ เข้าถึงข้อมูลของคุณหรือคุณจำเป็นต้องสนับสนุนบัญชี) SyncAdapterจะทำให้เกิดการใช้งานที่สำคัญ


2

เมื่อพูดถึงการซิงก์ข้อมูลซึ่งเกี่ยวข้องกับการเชื่อมต่อที่คุณต้องการสามารถปรับขนาดได้ ฉันเชื่อว่าวิธีที่แนะนำให้ใช้คืออะแดปเตอร์ซิงค์

ดูเหมือนว่าจะเป็นเช่นนั้นหากคุณดูคู่มือการฝึกอบรม Android: การสร้างอะแดปเตอร์ซิงค์

ส่วนประกอบอะแดปเตอร์ซิงค์ในแอปของคุณหุ้มรหัสสำหรับงานที่ถ่ายโอนข้อมูลระหว่างอุปกรณ์และเซิร์ฟเวอร์ ตามการกำหนดตารางเวลาและทริกเกอร์ที่คุณระบุในแอปกรอบการซิงค์อะแดปเตอร์จะรันโค้ดในองค์ประกอบอะแดปเตอร์ซิงค์ ...


2

ควรใช้อะแดปเตอร์ซิงค์เว้นแต่ว่าคุณต้องการข้อมูลแบบเรียลไทม์เนื่องจากมันจะทำการถ่ายโอนข้อมูลโดยอัตโนมัติตามเกณฑ์ที่หลากหลายเช่นการเปลี่ยนแปลงข้อมูลเวลาที่ผ่านไปเวลาของวัน ฯลฯ โดยจะรวมการถ่ายโอนข้อมูลทั้งหมดไว้ที่ส่วนกลาง ถ่ายโอนข้อมูลจากแอพอื่นซึ่งช่วยลดการใช้แบตเตอรี่

สำหรับงานด่วนที่เราสามารถใช้ได้

AsyncTaskสำหรับงานที่มีระยะเวลาสั้น ๆ อาจจะเป็น 3-4 วินาที

IntentServiceสำหรับงานที่ต้องใช้เวลานาน


พังทลายที่ยอดเยี่ยมสำหรับกฎของตัวเลือกนิ้วหัวแม่มือ
Brill Pappin

0

เนื่องจากเรากำลังพูดถึงการออกแบบเราควรพูดถึงการจัดการ SyncAdapters วัตถุ SyncResult และสิ่งที่เกิดขึ้นหลังจากนั้น

จริง ๆ แล้วฉันใช้ SyncAdapter เพื่อบอกให้ห้องสมุดของฉันทำการโทรทางเว็บ IntentService ไปยังเซิร์ฟเวอร์ของฉัน การจัดการการดำเนินการ "ซิงค์" นี้เป็นเรื่องยุ่งยาก

วิธีการหนึ่งที่ฉันทำตอนนี้คือการละทิ้งวัตถุ SyncResult อย่างสมบูรณ์และเพียงแค่ใช้บริการเพื่อบันทึกผลลัพธ์ของการ "ซิงค์" ของแต่ละคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.