รูปแบบ MVC บน Android


497

เป็นไปได้หรือไม่ที่จะใช้รูปแบบ model-view – controller ใน Java สำหรับ Android?

หรือมีการนำไปใช้แล้วผ่านกิจกรรมหรือไม่ หรือมีวิธีที่ดีกว่าในการใช้รูปแบบ MVC สำหรับ Android


64
คำถามของคุณดีมาก แต่คำตอบที่ทำเครื่องหมายว่าวิธีแก้ไขนั้นไม่ถูกต้องในความคิดของฉัน อาจทำให้เข้าใจผิดหลายคน
Saghar

4
ตรวจสอบ 2 โพสต์ของฉันเริ่มต้นที่นี่สถาปัตยกรรม Android: MV?
Dori

1
นอกจากนี้ยังมีชุดของกฎเพิ่มเติมที่จะต้องปฏิบัติตาม MVC หรือการพัฒนา Android ได้รับการปรับให้เหมาะกับ MVC เนื่องจากกิจกรรม, XML, ทรัพยากรหรือไม่
Flame of udun

3
@Dori, ฉันจะแก้ไขลิงก์ของคุณ: สถาปัตยกรรม Android: MV?
Andreybeta

บทความนี้ตรงกับสิ่งที่คุณกำลังมองหา MVC ใน Android ผ่านตัวอย่างการใช้งานจริง: digigene.com/architecture/android-architecture-part-2-mvc
Ali Nem

คำตอบ:


239

ใน Android คุณไม่มี MVC แต่คุณมีสิ่งต่อไปนี้:

  • คุณกำหนดส่วนต่อประสานผู้ใช้ของคุณในไฟล์ XML ต่างๆตามความละเอียดฮาร์ดแวร์ ฯลฯ
  • คุณกำหนดทรัพยากรของคุณในไฟล์ XML ต่างๆตามสถานที่ ฯลฯ
  • คุณขยาย clases เช่นListActivity , TabActivityและทำให้การใช้งานของไฟล์ XML โดยinflaters
  • คุณสามารถสร้างคลาสได้มากเท่าที่คุณต้องการสำหรับตรรกะทางธุรกิจของคุณ
  • Utilsจำนวนมากได้ถูกเขียนขึ้นสำหรับคุณแล้ว - DatabaseUtils, Html

3
@JDPekham ทำไมคุณถึงพูดว่า "คุณไม่สามารถยกตัวอย่างกิจกรรมได้โดยไม่ต้องพูดกับเลย์เอาต์ / มุมมองของคุณ" การสร้างอินสแตนซ์ของกิจกรรมไม่จำเป็นต้องมีการพูดคุยกับมุมมองในความเป็นจริงการพูดคุยกับมุมมองไม่ได้เป็นส่วนหนึ่งของการสร้างอินสแตนซ์ของกิจกรรม คุณสามารถ (แต่ไม่ต้อง) เรียกวิธีการกิจกรรมต่าง ๆ ที่โต้ตอบกับมุมมองของคุณเมื่อใดและถ้าคุณเห็นว่าเหมาะสม คำถามที่สอง: กิจกรรมสมมติว่ามีจุดประสงค์เพื่อรับบทบาท "คอนโทรลเลอร์" (ฉันเชื่อว่า Android devs หลายคนเห็นเป็นอย่างนั้น) ทำไมไม่พูดกับมุมมองของคุณจากกิจกรรม

8
สำหรับใครก็ตามที่บอกว่า "Android is MVC" โปรดลอง Backbone.js (ใช่แล้วฝั่งไคลเอ็นต์ js) เป็นเวลาหนึ่งสัปดาห์จากนั้นกลับมาและพูดว่า "Android is MVC" ในที่สุดคุณจะเข้าใจคำถามและเหตุผลที่เราถามอยู่เรื่อย ๆ :)
Mark Peterson

14
"ใน Android คุณไม่มี MVC" ???? ใน Android เช่นเดียวกับในภาษาอื่นคุณมี MVC หากคุณต้องการ MVC
Lorenzo Barbagli

1
@LorenzoBarbagli เขาหมายความว่า Android ไม่บังคับใช้ MVC ในแอพตามการออกแบบ (เช่นเดียวกับ iOS) คุณต้องใช้รสชาติของ MVC, MVP หรืออย่างอื่นด้วยตัวคุณเองหากคุณต้องการบรรลุสิ่งที่ MVC มอบให้ - นั่นคือการแยกข้อกังวลและตัวแบบที่แยกได้และทดสอบได้ง่าย
Piovezan

ไม่แน่นอนมี MVC ใน Android แต่มีนัยมากกว่า มันใช้งานในวิธีที่แตกต่างกันไปตามวิธีการที่ Android สร้างโครงสร้างทุกอย่าง
6

229

ไม่มีรูปแบบ MVC ที่เป็นสากล MVC เป็นแนวคิดมากกว่ากรอบการเขียนโปรแกรมที่มั่นคง คุณสามารถใช้ MVC ของคุณเองบนแพลตฟอร์มใดก็ได้ ตราบใดที่คุณยึดมั่นกับแนวคิดพื้นฐานต่อไปนี้คุณกำลังใช้ MVC:

  • รุ่น:อะไรที่จะทำให้
  • ดู:วิธีการแสดงผล
  • ตัวควบคุม:เหตุการณ์อินพุตของผู้ใช้

คิดด้วยวิธีนี้เช่นกัน: เมื่อคุณตั้งโปรแกรมโมเดลของคุณโมเดลไม่ควรกังวลเกี่ยวกับการแสดงผล (หรือรหัสเฉพาะแพลตฟอร์ม) รูปแบบจะพูดกับมุมมองฉันไม่สนใจว่าการแสดงผลของคุณเป็น Android หรือ iOS หรือ Windows Phone นี่คือสิ่งที่ฉันต้องการให้คุณแสดง มุมมองจะจัดการกับรหัสการแสดงผลเฉพาะแพลตฟอร์มเท่านั้น

สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณใช้Monoเพื่อแบ่งปันโมเดลเพื่อพัฒนาแอปพลิเคชันข้ามแพลตฟอร์ม


12
ในขณะที่เป็นจริงและใส่ดีนี้เป็นทฤษฎีและผู้คนในทางปฏิบัติ!
TWiStErRob

1
@TWiStErRob แต่รูปแบบการออกแบบเป็นเชิงทฤษฎีความคิดเชิงนามธรรมซึ่งไม่มีทางรู้เพียงวิธีเดียว ประกาศว่า“ ฉันไม่ต้องการที่จะเข้าใจ MVC ในทางทฤษฎีฉันแค่ต้องการที่จะนำไปใช้” เสียงที่ฉันชอบมันอาจส่งผลให้“ ฉันจะใส่เครื่องซักผ้าในห้องครัวของฉันเพราะเครื่องซักผ้าใช้รูปแบบ Cleaner ™ และห้องครัวต้องการสิ่งนั้น”
ลุค

1
ฉันคิดว่าตัวอย่างเป็นสิ่งที่ประเมินค่าไม่ได้เพราะพวกเขาแสดงให้เห็นว่าคนอื่น ๆ คิดอย่างไร หนึ่งสามารถปรับปรุงพวกเขาและเรียนรู้จากความพยายามของพวกเขา ไม่จำเป็นสำหรับทุกคนที่จะบูรณาการล้อ ในบริบทของ Android และเป็นวงจรชีวิตที่ซับซ้อนมีปัญหาที่ไม่ได้ระบุไว้ในรูปแบบการออกแบบ แต่ทุกคนจะต้องเผชิญกับพวกเขา นี่คือสิ่งที่ฉันหมายถึงโดยการปฏิบัติ
TWiStErRob

47

แอ็คชั่นมุมมองและกิจกรรมบน Android เป็นวิธีการทำงานร่วมกับ Android UI และนำไปใช้กับรูปแบบ model – view – viewmodel (MVVM)ซึ่งมีโครงสร้างคล้ายกัน (ในตระกูลเดียวกัน) model – view -controller

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


29

หลังจากค้นหาบางคำตอบที่เหมาะสมที่สุดคือ:

MVC ได้รับการติดตั้งใน Android เป็น:

  1. ดูรูปแบบ = ทรัพยากรและสร้างขึ้นในชั้นเรียนเช่นมาจากButtonandroid.view.View
  2. ตัวควบคุม = กิจกรรม
  3. Model = คลาสที่ใช้ตรรกะของแอปพลิเคชัน

(วิธีนี้แสดงถึงไม่มีตรรกะโดเมนแอปพลิเคชันในกิจกรรม)

สิ่งที่สมเหตุสมผลที่สุดสำหรับนักพัฒนารายย่อยคือการทำตามรูปแบบนี้และไม่พยายามทำสิ่งที่ Google ตัดสินใจไม่ทำ

PS ทราบว่ากิจกรรมบางครั้งจะเริ่มต้นใหม่จึงเป็นสถานที่สำหรับข้อมูลแบบไม่มี (วิธีที่ง่ายที่สุดที่จะทำให้เกิดการรีสตาร์ทคือการละเว้นandroid:configChanges="keyboardHidden|orientation"จาก XML และเปิดอุปกรณ์ของคุณ)

แก้ไข

เราอาจจะพูดคุยเกี่ยวกับMVCแต่มันจะเป็นเพื่อที่จะพูดFMVC , กรอบ - รุ่น - ดู - ควบคุม กรอบ (ระบบปฏิบัติการ Android) กำหนดความคิดของวงจรชีวิตของส่วนประกอบและเหตุการณ์ที่เกี่ยวข้องและในทางปฏิบัติควบคุม ( Activity/ Service/ BroadcastReceiver) เป็นครั้งแรกของการรับผิดชอบทั้งหมดสำหรับการรับมือกับเหล่ากรอบ -imposed เหตุการณ์ (เช่นonCreate () ) อินพุตของผู้ใช้ควรถูกประมวลผลแยกกันหรือไม่? แม้ว่ามันจะเป็นไปได้ แต่คุณก็ไม่สามารถแยกมันออกได้กิจกรรมป้อนข้อมูลของผู้ใช้ก็มาจาก Android

อย่างไรก็ตามรหัสน้อยที่ไม่ได้เป็นเฉพาะของ Android ที่คุณใส่ลงในของคุณActivity/ Service/ BroadcastReceiverที่ดีกว่า


3
กิจกรรมมีการเข้าถึง UI โดยตรงในขณะที่ผู้ควบคุม MVC ไม่ควรรู้เกี่ยวกับมุมมอง (เฉพาะในทางกลับกัน)
Konrad Morawski

2
@KonradMorawski อืมม .... ดูรู้เกี่ยวกับการแสดงสิ่งและเกี่ยวกับการควบคุม ? ลูกของพูดButtonรู้เกี่ยวกับตัวควบคุมหรือไม่ ดูเหมือนว่ามีเหตุผลมากกว่าที่ผู้ชมจะได้รู้เพียงการแสดงสิ่งต่าง ๆ และคำนึงถึงว่ารุ่นเท่านั้นที่รู้เกี่ยวกับธรรมชาติของข้อมูลนี้คือเหตุผลที่ควบคุมเป็นสิ่งจำเป็น: สิ่งที่จะต้องรู้ว่าทั้งสองเกี่ยวกับรุ่นและดู
18446744073709551615

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

1
ฉันคิดว่าServiceมาภายใต้ร่มของผู้ควบคุมด้วย
CL22

1
เคยได้ยินผู้สังเกตการณ์หรือไม่ การแยก Iv ที่ดีที่สุดที่พบคือเมื่อ 1. คอนโทรลเลอร์มีเพียงตัวอย่างรุ่นเท่านั้น 2. โมเดลไม่มีความรู้ในการควบคุมหรือมุมมอง แต่มุมมองสามารถลงทะเบียนเป็นผู้สังเกตการณ์รุ่น (ดังนั้นแบบจำลองรู้เกี่ยวกับมุมมอง ไม่สนใจ) - เมื่อแบบจำลองเสร็จสิ้นด้วยการโหลดข้อมูลเขาจะแจ้งผู้สังเกตการณ์ทั้งหมด (ปกติ 1) และ 3 มุมมองมีเพียงอินสแตนซ์ของโมเดลเพื่อดึงข้อมูลออกมา วิธีนี้มีเพียง 2 การพึ่งพาสำหรับกรอบ MVC ทั้งหมด ฉันคิดว่า 2 มีค่าน้อยที่สุดดังนั้นควรเป็นเลย์เอาต์ที่ดีที่สุด
Srneczek

18

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

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

หากคุณกำหนดมุมมองและเลย์เอาต์ของคุณในไฟล์ XML ให้โหลดทรัพยากรของคุณจากโฟลเดอร์ res และหากคุณหลีกเลี่ยงการรวมสิ่งเหล่านี้ในรหัสของคุณมากขึ้นหรือน้อยลงคุณก็ยังคงติดตามรูปแบบ MVC อยู่ดี


14

คุณสามารถใช้ MVC ใน Android ได้ แต่ไม่รองรับ "แบบดั้งเดิม" และใช้ความพยายาม

ที่กล่าวว่าฉันเองมีแนวโน้มต่อMVPเป็นรูปแบบสถาปัตยกรรมที่สะอาดกว่ามากสำหรับการพัฒนา Android และด้วยการพูด MVP ฉันหมายถึงสิ่งนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้โพสต์คำตอบอย่างละเอียดยิ่งขึ้นที่นี่ด้วย

หลังจากที่เล่นด้วยวิธีการต่างๆในการดำเนินการ MVC / MVP ใน Android ของฉันมาที่มีรูปแบบสถาปัตยกรรมที่เหมาะสมซึ่งผมอธิบายไว้ในบทความนี้: MVP และ MVC รูปแบบสถาปัตยกรรมใน Android


14

แหล่งข้อมูลที่ดีที่สุดที่ฉันพบว่าใช้ MVC บน Android คือโพสต์นี้ :

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

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


8
จะดีมากหากได้รับการสรุปในกรณีที่บทความถูกลบไปหนึ่งวัน
pqsk

12

ฉันเห็นด้วยกับ JDPeckham และฉันเชื่อว่า XML เพียงอย่างเดียวไม่เพียงพอที่จะใช้ส่วน UI ของแอปพลิเคชัน

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

(หรือคุณสามารถใช้รูปแบบซิงเกิลตามที่แนะนำโดยเอกสารประกอบการสมัคร)


12

MVC- สถาปัตยกรรมบน Android ดีกว่าที่จะติดตาม MVP ใด ๆ แทน MVC ใน Android แต่ก็ยังคงเป็นไปตามคำตอบของคำถามนี้สามารถแก้ปัญหาได้

ป้อนคำอธิบายภาพที่นี่

คำอธิบายและแนวทางปฏิบัติ

     Controller -
        Activity can play the role.
        Use an application class to write the
        global methods and define, and avoid
        static variables in the controller label
    Model -
        Entity like - user, Product, and Customer class.
    View -
        XML layout files.
    ViewModel -
        Class with like CartItem and owner
        models with multiple class properties
    Service -
        DataService- All the tables which have logic
        to get the data to bind the models - UserTable,
        CustomerTable
        NetworkService - Service logic binds the
        logic with network call - Login Service
Helpers -
        StringHelper, ValidationHelper static
        methods for helping format and validation code.
SharedView - fragmets or shared views from the code
        can be separated here

AppConstant -
        Use the Values folder XML files
        for constant app level

หมายเหตุ 1:

ตอนนี้ที่นี่คือเวทย์มนตร์ที่คุณสามารถทำได้ เมื่อคุณจำแนกรหัสแล้วให้เขียนคลาสอินเตอร์เฟสพื้นฐานเช่น IEntity และ IService ประกาศวิธีการทั่วไป ตอนนี้สร้าง BaseService ระดับนามธรรมและประกาศชุดวิธีการของคุณเองและมีการแยกรหัส

หมายเหตุ 2:หากกิจกรรมของคุณนำเสนอหลายรุ่นแทนที่จะเขียนโค้ด / ตรรกะในกิจกรรมจะเป็นการดีกว่าที่จะแบ่งมุมมองเป็นชิ้นส่วน ถ้าอย่างนั้นก็ดีกว่า ดังนั้นในอนาคตหากต้องการโมเดลเพิ่มเติมเพื่อแสดงในมุมมองให้เพิ่มแฟรกเมนต์อีกหนึ่งรายการ

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


11

การสร้าง UI Android โดยใช้เลย์เอาต์ทรัพยากรกิจกรรมและ Intents เป็นการใช้รูปแบบ MVC โปรดดูลิงค์ต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ - http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

มิเรอร์สำหรับ pdf


7
ลิงค์เสียครับ
Rat-a-tat-a-tat Ratatouille

2
ดูเหมือนว่าไฟล์ COSC346-lab2.2up.pdf นี้ไม่มีรายละเอียดครบถ้วน
james

9

รูปแบบ MVC ของ Android นั้นถูกนำไปใช้กับคลาสAdaptor พวกเขาแทนที่ตัวควบคุมด้วย "อะแดปเตอร์" คำอธิบายสำหรับสถานะอะแดปเตอร์:

วัตถุอะแดปเตอร์ทำหน้าที่เป็นสะพานเชื่อมระหว่าง AdapterView และข้อมูลพื้นฐานสำหรับมุมมองนั้น

ฉันแค่กำลังมองหาสิ่งนี้สำหรับแอปพลิเคชัน Android ที่อ่านจากฐานข้อมูลดังนั้นฉันจึงไม่ทราบว่ามันใช้งานได้ดีเพียงใด อย่างไรก็ตามดูเหมือนว่าจะเป็นสถาปัตยกรรม Model-View-Delegate ของ Qt ซึ่งพวกเขาอ้างว่าเป็นขั้นตอนที่เพิ่มขึ้นจากรูปแบบ MVC แบบดั้งเดิม อย่างน้อยบนพีซีรูปแบบของ Qt ทำงานได้ค่อนข้างดี


9

แม้ว่าโพสต์นี้จะเก่า แต่ฉันต้องการเพิ่มสองสิ่งต่อไปนี้เพื่อแจ้งเกี่ยวกับการพัฒนาล่าสุดในพื้นที่นี้สำหรับ Android:

android-binding - การจัดเตรียมเฟรมเวิร์กที่เปิดใช้งานการโยงวิดเจ็ตมุมมอง android กับโมเดลข้อมูล ช่วยในการใช้รูปแบบ MVC หรือ MVVM ในแอปพลิเคชัน Android

roboguice - RoboGuice นำการคาดเดาออกจากการพัฒนา ฉีดมุมมองทรัพยากรบริการระบบหรือวัตถุอื่น ๆ ของคุณแล้วปล่อยให้ RoboGuice ดูแลรายละเอียด


9

Model View Controller (MVC)

ป้อนคำอธิบายรูปภาพที่นี่


รายละเอียด:

  • เมื่อเราต้องทำโครงการขนาดใหญ่ในการพัฒนาซอฟต์แวร์ MVC มักจะถูกนำมาใช้เพราะมันเป็นวิธีที่เป็นสากลในการจัดระเบียบโครงการ
  • นักพัฒนาใหม่สามารถปรับให้เข้ากับโครงการได้อย่างรวดเร็ว
  • ช่วยในการพัฒนาโครงการขนาดใหญ่และข้ามแพลตฟอร์มด้วย

รูปแบบ MVC เป็นหลักนี้:

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

คุณสมบัติที่สำคัญของ MVC: เราสามารถปรับเปลี่ยนทั้งรุ่นหรือมุมมองหรือตัวควบคุมยังคงไม่ส่งผลกระทบต่อคนอื่น

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

2
ฉันเคยใช้คอนโทรลเลอร์เป็นสื่อกลางสำหรับวิธีดูข้อมูล / โมเดลรีเลย์ ฉันอยากรู้ว่าคุณมีรุ่นและดูอย่างไรในการติดต่อโดยตรงกับคนอื่น คุณมีแหล่งที่มาหรือตัวอย่างของการใช้งานนี้หรือไม่?
Jacksonkr

7

ฉันคิดว่าคำอธิบายแบบย่อที่มีประโยชน์ที่สุดอยู่ที่นี่: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf

จากทุกสิ่งทุกอย่างที่ฉันเคยเห็นและอ่านที่นี่การใช้ทุกสิ่งเหล่านี้ทำให้มันยากขึ้นและไม่เหมาะกับส่วนอื่น ๆ ของ android

การมีกิจกรรมให้ผู้ฟังคนอื่นใช้เป็นทางมาตรฐานของ Android อยู่แล้ว วิธีที่ไม่เป็นอันตรายที่สุดคือการเพิ่ม Java Observer เช่นสไลด์อธิบายและจัดกลุ่ม onClick และการกระทำประเภทอื่น ๆ ลงในฟังก์ชันที่ยังคงอยู่ในกิจกรรม

วิธี Android เป็นกิจกรรมที่ทำทั้งสองอย่าง การต่อสู้มันไม่ได้ทำให้การขยายหรือทำการเข้ารหัสในอนาคตง่ายขึ้น

ผมเห็นด้วยกับการโพสต์ 2 มันนำไปใช้งานแล้วไม่ใช่วิธีที่ผู้คนคุ้นเคย ไม่ว่าไฟล์นั้นจะอยู่ในไฟล์เดียวกันหรือไม่ก็ตาม ไม่จำเป็นต้องสร้างการแยกพิเศษเพื่อให้เหมาะกับภาษาและระบบปฏิบัติการอื่น ๆ


6
ลิงก์ที่คุณระบุเสีย
mmBs

6

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

ใน MVC เลเยอร์มุมมองจะรู้วิธีแสดงส่วนติดต่อผู้ใช้ (UI) เท่านั้น หากต้องการข้อมูลใด ๆ ก็จะได้รับจากเลเยอร์โมเดล แต่ดูไม่ได้โดยตรงขอให้รูปแบบการค้นหาข้อมูลที่มันไม่ได้ผ่านตัวควบคุม ดังนั้นควบคุม  เรียกรุ่นที่จะให้ข้อมูลที่จำเป็นสำหรับการดู เมื่อข้อมูลมีความพร้อมที่ควบคุมแจ้งดูว่าข้อมูลที่มีความพร้อมที่จะได้มาจากรุ่น ตอนนี้มุมมองสามารถรับข้อมูลจากโมเดลได้

โฟลว์นี้สามารถสรุปได้ดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

เป็นที่น่าสังเกตว่ามุมมองสามารถทราบเกี่ยวกับความพร้อมใช้งานของข้อมูลในตัว  แบบ  ทั้งผ่านตัวควบคุม - หรือที่เรียกว่า  Passive MVC - หรือโดยการสังเกตข้อมูลในตัวแบบโดยการลงทะเบียนที่สามารถสังเกตได้ซึ่งเป็นActive MVCMVC

ในส่วนของการดำเนินการอย่างใดอย่างหนึ่งในสิ่งแรกที่มาคิดเป็นว่าสิ่งที่หุ่นยนต์ชิ้นส่วนต้องใช้สำหรับการดู ? Activity  หรือFragment  ?

คำตอบคือมันไม่สำคัญและสามารถใช้ได้ทั้งคู่ ดูควรจะสามารถที่จะนำเสนอส่วนติดต่อผู้ใช้ (UI) บนอุปกรณ์และตอบสนองต่อการโต้ตอบกับผู้ใช้ที่มีการ UI ทั้งActivity  และFragment   ให้วิธีการที่จำเป็นสำหรับการนี้

ในตัวอย่างแอพที่ใช้ในบทความนี้ฉันใช้Activity สำหรับเลเยอร์มุมมองแต่Fragment  ยังสามารถใช้ได้

แอปตัวอย่างที่สมบูรณ์สามารถพบได้ในสาขา 'mvc' ของ repo GitHub ของฉันที่นี่ที่นี่

ฉันได้จัดการกับข้อดีข้อเสียของสถาปัตยกรรม MVC ใน Android ผ่านตัวอย่างที่นี่ที่นี่

สำหรับผู้ที่สนใจฉันได้เริ่มบทความเกี่ยวกับสถาปัตยกรรมแอพ android ที่นี่ซึ่งฉันเปรียบเทียบสถาปัตยกรรมที่แตกต่างกันเช่น MVC, MVP, MVVM สำหรับการพัฒนาแอพ android ผ่านแอพที่ทำงานได้สมบูรณ์


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

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

5

เมื่อยล้าจากภัยพิบัติ MVx บน Android เมื่อเร็ว ๆ นี้ฉันได้สร้างห้องสมุดเล็ก ๆ ที่ให้การไหลของข้อมูลทางเดียวและคล้ายกับแนวคิดของ MVC: https://github.com/zserge/anvil

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

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

นี่คือตัวอย่างของส่วนประกอบที่มีทุกอย่างอยู่ภายในสำหรับความกะทัดรัดของรหัส (แน่นอนว่ารุ่นและตัวควบคุมสามารถแยกได้ง่าย) ที่นี่ "นับ" เป็นรูปแบบมุมมอง () วิธีการคือมุมมองและ "v -> นับ ++" เป็นตัวควบคุมที่ฟังปุ่มคลิกและปรับปรุงรูปแบบ

public MyView extends RenderableView {
  public MyView(Context c) {
      super(c);
  }

  private int count = 0;

  public void view() {
    frameLayout(() -> {              // Define your view hierarchy
      size(FILL, WRAP);
      button(() -> {
          textColor(Color.RED);      // Define view style
          text("Clicked " + count);  // Bind data
          onClick(v -> count++);     // Bind listeners
      });
    });
  }

ด้วยรูปแบบที่แยกออกมาและตัวควบคุมมันจะมีลักษณะ:

button(() -> {
   textColor(Color.RED);
   text("Clicked " + mModel.getClickCount());
   onClick(mController::onButtonClicked);
});

ที่นี่ในแต่ละปุ่มคลิกหมายเลขจะเพิ่มขึ้นจากนั้น "render ()" จะถูกเรียกและข้อความของปุ่มจะได้รับการปรับปรุง

ไวยากรณ์กลายเป็นที่น่าพอใจมากขึ้นถ้าคุณใช้ Kotlin: http://zserge.com/blog/anvil-kotlin.html นอกจากนี้ยังมีไวยากรณ์ทางเลือกสำหรับ Java โดยไม่มี lambdas

ห้องสมุดมีน้ำหนักเบามากไม่มีการพึ่งพาไม่มีการสะท้อน ฯลฯ

(ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนของห้องสมุดนี้)


4

ตามคำอธิบายที่ทีม Xamarin อธิบาย (บน iOS MVC "ฉันรู้ว่ามันดูแปลก ๆ แต่รอสักครู่"):

  • รูปแบบ (ข้อมูลหรือตรรกะการใช้งาน)
  • มุมมอง (ส่วนต่อประสานผู้ใช้) และ
  • ตัวควบคุม (โค้ดด้านหลัง)

ฉันสามารถพูดสิ่งนี้:

รูปแบบบน Android เป็นเพียงวัตถุที่พัสดุได้ มุมมองคือโครงร่าง XML และคอนโทรลเลอร์คือ (กิจกรรม + ส่วนของมัน)

* นี่เป็นเพียงความเห็นของฉันไม่ใช่จากแหล่งข้อมูลหรือหนังสือ


4

ไม่มีสถาปัตยกรรม MVC ที่นำมาใช้ แต่มีชุดของไลบรารี / ตัวอย่างเพื่อใช้สถาปัตยกรรม MVP (model – view – presenter)

กรุณาตรวจสอบลิงค์เหล่านี้:

Google เพิ่มตัวอย่างของสถาปัตยกรรม MVP ของ Android:


3

ฉันเห็นแล้วว่ามีหลายคนกำลังบอกว่า MVC ได้รับการติดตั้งใน Android แล้ว แต่ก็ไม่เป็นความจริง Android ไม่มี MVC ตามค่าเริ่มต้น

เพราะฉันไม่ได้ Google จะบังคับให้มีข้อ จำกัด ของการใช้ MVC อย่างเช่น iPhone แต่สำหรับนักพัฒนาที่รู้ใจหรือเทคนิคที่พวกเขาต้องการในโครงการของพวกเขาในแอปพลิเคชันขนาดเล็กหรือใช้งานง่ายไม่จำเป็นต้องใช้ MVC แต่เป็นแอปพลิเคชัน เติบโตและซับซ้อนขึ้นและต้องการการแก้ไขรหัสในปีต่อมาจากนั้นก็มีความต้องการรูปแบบ MVC ใน Android

มันมีวิธีง่าย ๆ ในการปรับเปลี่ยนรหัสและยังช่วยในการลดปัญหา หากคุณต้องการติดตั้ง MVC บน Android ให้ทำตามลิงค์ด้านล่างนี้เพื่อรับ MVC ในโครงการของคุณ

http://www.therealjoshua.com/2011/11/android-architecture-part-1-intro/

แต่ทุกวันนี้ฉันคิดว่า MVP พร้อมกับ Android Architectural Pattern เป็นหนึ่งในนักพัฒนาตัวเลือกที่ดีที่สุดที่ควรใช้สำหรับแอปพลิเคชัน Android ที่สะอาดและมีประสิทธิภาพ


1
ตกลง Android มีความยืดหยุ่นเพียงพอที่จะแขวนตัวเอง กิจกรรมของคุณนั้นสามารถเติบโตอย่างมหาศาลและซับซ้อนได้เนื่องจากมันจัดการทั้งสามด้านของ MVC
Scott Biggs

2

เมื่อเราใช้ MVC, MVVMหรือรูปแบบการนำเสนอกับแอพ Android สิ่งที่เราต้องการคือการมีโครงสร้างที่ชัดเจนและที่สำคัญกว่าสำหรับการทดสอบหน่วย

ในขณะนี้หากไม่มีกรอบงานของบุคคลที่สามคุณมักจะมีโค้ดจำนวนมาก (เช่น addXXListener (), findViewById () ฯลฯ ) ซึ่งไม่ได้เพิ่มมูลค่าทางธุรกิจใด ๆ

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

RoboBinding ช่วยให้คุณเขียนรหัส UI ที่ง่ายต่อการอ่านทดสอบและบำรุงรักษา RoboBinding ลบต้องของรหัสที่ไม่จำเป็นเช่น addXXListener หรือดังนั้นและตรรกะกะ UI ที่จะนำเสนอรุ่นซึ่งเป็น POJO และสามารถทดสอบผ่านการทดสอบ JUnit ปกติ RoboBinding มาพร้อมกับการทดสอบ JUnit มากกว่า 300 รายการเพื่อรับรองคุณภาพ


1

ในความเข้าใจของฉันวิธีที่ Android จัดการกับรูปแบบ MVC นั้นเป็นอย่างไร:

คุณมีกิจกรรมซึ่งทำหน้าที่เป็นตัวควบคุม คุณมีคลาสที่รับผิดชอบในการรับข้อมูล - โมเดลและจากนั้นคุณมีคลาส View ซึ่งเป็นมุมมอง

เมื่อพูดถึงมุมมองที่คนส่วนใหญ่คิดว่าเฉพาะส่วนของภาพที่กำหนดไว้ใน xml อย่าลืมว่า View ยังมีส่วนของโปรแกรมที่มีตัวสร้างวิธีการและอื่น ๆ ที่กำหนดไว้ในคลาส java

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