2016-12-06 5 views
5

मैं एक एंड्रॉइड ऐप विकसित कर रहा हूं जिसमें मुझे रनटाइम पर अनुमतियां मांगनी होंगी। मैं मॉडल-व्यू-प्रेजेंटर आर्किटेक्चर का उपयोग करके इसे लागू करने का सबसे अच्छा तरीका सोच रहा हूं।एमवीपी आर्किटेक्चर का उपयोग कर रनटाइम पर अनुमतियों की जांच करने का सबसे अच्छा तरीका क्या है?

मेरा प्रारंभिक विचार था कि प्रेजेंटर अनुमतियों के लिए जिम्मेदार घटक को कॉल करें (PermissionHandler कहें), और तदनुसार अपडेट अपडेट करें।

मुद्दा यह है कि अनुमतियों की जांच करने के लिए कोड गतिविधि वर्ग के साथ कसकर मिलकर है। यहाँ है कि एक गतिविधि या संदर्भ की आवश्यकता शामिल तरीकों में से कुछ हैं:

  • ContextCompat.checkSelfPermission()
  • ActivityCompat.shouldShowRequestPermissionRationale()
  • ActivityCompat.requestPermissions()
  • onRequestPermissionsResult() (कॉलबैक)

इसका मतलब यह है कि मैं एक पारित करने के लिए होता है प्रस्तुतकर्ता को गतिविधि ऑब्जेक्ट, जिसे मुझे ज्यादा पसंद नहीं आया क्योंकि मैंने सुना है कि एंड्रॉइड कोड से अपने प्रेजेंटर को मुक्त रखना टेस्टिन के लिए अच्छा है जी।

इसके कारण, मैंने फिर दृश्य स्तर (गतिविधि में) पर अनुमतियों को संभालने के बारे में सोचा, लेकिन फिर मुझे लगता है कि यह केवल व्यावसायिक तर्क के बिना यूआई अपडेट के लिए जिम्मेदार दृश्य को छोड़ने के उद्देश्य को नुकसान पहुंचाएगा।

मुझे यकीन नहीं है कि कोड को यथासंभव decoupled और रखरखाव के रूप में रखने से निपटने के लिए सबसे अच्छा तरीका क्या होगा। कोई विचार?

उत्तर

7

मुझे क्या होता है:

दृश्य को लागू करेगा:

public Activity getViewActivity(); 

प्रस्तोता को लागू करेगा:

public void requestPermissions(); 
public void onPermissionsResult(); 

requestPermissions अंदर, प्रस्तोता होंगी: getViewActivity().checkSelfPermission; getViewActivity.requestPermissions(); etc.

दृश्यके अंदर कॉल करेगाpresenter.onPermissionsResult();

पर कॉलबैक के साथ यह सभी तर्क प्रस्तुतकर्ता के अंदर लागू किया जाएगा।

मेरी राय में, आपका प्रस्तुतकर्ता decoupled है: यह किसी भी दृश्य कार्यान्वयन पर निर्भर नहीं होगा (यह केवल दृश्य इंटरफ़ेस पर निर्भर करेगा)।

"मैंने सुना है कि आपके प्रस्तुतकर्ता को एंड्रॉइड कोड से मुक्त रखना परीक्षण के लिए अच्छा है।" मैं इस हिस्से को समझ नहीं पा रहा हूं। यदि कोड अच्छा है, तो बिना किसी समस्या के परीक्षण किया जा सकता है।

+0

क्या यह दृष्टिकोण सुरक्षित होगा? क्या यह स्मृति रिसाव उत्पन्न नहीं करना चाहिए? – fobo66

1

यदि आप अभी भी अनुमति पहुंच/अनुरोधों का नकल करने में सक्षम होना चाहते हैं, तो भी आप PermissionHandler जैसे कुछ बनाते हैं, लेकिन केवल इसे अपने व्यू क्लास के अंदर संदर्भित करते हैं।

public interface PermissionsHandler { 
    boolean checkHasPermission(AppCompatActivity activity, String permission); 
    void requestPermission(AppCompatActivity activity, String[] permissions, int requestCode); 
} 

उत्पादन कार्यान्वयन:

public class PermissionsHandlerAndroid implements PermissionsHandler { 
    @Override 
    public boolean checkHasPermission(AppCompatActivity activity, String permission) { 
     return ContextCompat.checkSelfPermission(activity, permission) == PackageManager.PERMISSION_GRANTED; 
    } 

    @Override 
    public void requestPermission(AppCompatActivity activity, String[] permissions, int requestCode){ 
     ActivityCompat.requestPermissions(activity, permissions, requestCode); 
    } 
} 

ठट्ठा वर्ग (उदाहरण के लिए, का परीक्षण करने और सुनिश्चित करें कि आपके गतिविधि सही ढंग से onRequestPermissionsResult संभालती बनाने के लिए)

public class PermissionsHandlerMocked implements PermissionsHandler { 
    @Override 
    public boolean checkHasPermission(AppCompatActivity activity, String permission) { 
     return false; 
    } 

    @Override 
    public void requestPermission(AppCompatActivity activity, String[] permissions, int requestCode){ 
     int[] grantResults = new int[permissions.length]; 
     for (int i = 0; i < permissions.length; i++) { 
      grantResults[i] = PackageManager.PERMISSION_GRANTED 
     } 
     activity.onRequestPermissionResult(requestCode, permissions, grantResults); 
    } 
} 

इंटरफ़ेस - उदाहरण के लिए फिर आपकी गतिविधि में:

PermissionsHandler permissionsHandler; 

@Override 
protected void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    permissionsHandler = Injection.providePermissionsHandler(); 
    //or however you choose to inject your production vs mocked handler. 
} 

//method from your view interface, to be called by your presenter 
@Override 
void requestLocationPermission() { 
    permissionsHandler.requestPermision((AppCompatActivity) this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_LOCATION}; 
} 

fobo66, आप हमेशा दृश्य checkLocationPermissionGranted() और requestLocationPermission() की तरह और अधिक सामान्य तरीकों को लागू कर सकते हैं। फिर आपका दृश्य कार्यान्वयन आवश्यकतानुसार गतिविधि का संदर्भ दे सकता है, और आपके प्रस्तुतकर्ता को कभी भी गतिविधि संदर्भ को छूना नहीं पड़ता है।

संबंधित मुद्दे

 संबंधित मुद्दे