2015-11-26 7 views
5

मैं एक ही SimpleDraweeView पर अनुक्रमिक रूप से एकाधिक छवियां चलाता हूं, समस्या यह है कि एक नया imageURI अनुरोध सबमिट करते समय, SimpleDrweeView वर्तमान प्रदर्शित छवि को हटा देगा और इसे प्रतिस्थापित करेगा यूआरआई डाउनलोड होने तक कुछ नहीं। तो यह खेल अनुक्रम में अंतराल छोड़ देगा (आप सोच सकते हैं कि मैं क्या करने की कोशिश कर रहा हूं स्थानीय फोटो का उपयोग कर कार्टून एनीमेशन है)। मैं सरल छवि को छोड़ने के लिए SimpleDrweeView के लिए क्या चाहूंगा, जब तक कि नया डाउनलोड न हो जाए और फिर तैयार होने पर इसे स्वैप करें।फ़्रेस्को: अगले अनुरोध के लिए प्लेसहोल्डर के रूप में ड्रैवे में प्रदर्शित वर्तमान छवि का उपयोग करें

मैंने पुराने यूरी को प्लेसहोल्डर के रूप में रखने के लिए this टिकट से निम्न-रेज/उच्च-रेज योजना का उपयोग करने की कोशिश की लेकिन यह काम नहीं किया (पहले जैसा ही प्रभाव था)।

यह वही है मैं अब है:

SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); 

draweeView.setImageURI(uri /* local image */); 

और यही मैं अब तक की कोशिश की (काम नहीं किया है):

   SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); 

      Uri lowResUri, highResUri; 
      DraweeController controller = Fresco.newDraweeControllerBuilder().setTapToRetryEnabled(true) 
        .setLowResImageRequest(ImageRequest.fromUri((Uri) draweeView.getTag())) /*naive way to test the low/high res feature*/ 
        .setImageRequest(ImageRequest.fromUri(uri)) 
        .setOldController(draweeView.getController()) 
        .build(); 
      draweeView.setTag(uri); 
      draweeView.setController(controller); 

उत्तर

3

मैं फ्रेस्को टीम का हिस्सा हूं और हो सकता है मदद करने में सक्षम यह अजीब बात है कि आप कम-रेज/उच्च-रेज संयोजन के साथ एक ही समस्या का अनुभव करते हैं। अगर छवि वर्तमान में प्रदर्शित की गई है, तो इसका मतलब है कि यह बिटमैप मेमोरी कैश में होना चाहिए, जिसका अर्थ यह है कि अगली बार जब आप अगली फ्रेम पर स्विच कर रहे हों तो इसे कम-रेज छवि के रूप में सेट करते समय तत्काल लोड करने में सक्षम होना चाहिए। क्या आप वाकई सही यूरी को निम्न-रेज छवि के रूप में सेट कर रहे हैं? (Uri) draweeView.getTag() संदिग्ध दिखता है। मैं उस भाग को दोबारा जांच दूंगा।

यदि उरी वास्तव में सही है, लेकिन छवि अब बिटमैप कैश में नहीं है, तो यह जांचने योग्य होगा कि दृश्यमान छवि अब कैश नहीं की गई है, क्योंकि हमारे पास स्पष्ट तर्क है जो दृश्यमान evicting को रोकना चाहिए इमेजिस। वर्बोज लॉगिंग here के साथ इसे ट्रैक करने का तरीका देखें।

यदि उपर्युक्त सभी विफल हो जाते हैं, तो तीसरे विकल्प वास्तव में आपके DataSource को लागू करना है। मैं इसके साथ मदद कर सकता हूं, लेकिन यह कुछ हद तक शामिल हो सकता है। मूल विचार DataSource को लागू करना है जो वास्तव में छवि प्रदान करता है जो DataSource लपेटता है। फिर आप ऐसा कुछ कर सकते हैं:

// keep this instance somewhere 
mMyDataSourceSupplier = new MyDataSourceSupplier(); 

// build controller by specifying your custom datasource supplier instead of specifying any URIs. 
Fresco.newDraweeControllerBuilder() 
    .setDataSourceSupplier(mMyDataSourceSupplier) 
    .build() 

// later, when you need to change the image do 
mMyDataSourceSupplier.setUri(nextUri); 

// this is just an outline 
class MyDataSourceSupplier implements Supplier<DataSource<CloseableReference<CloseableImage>>> { 

    private Uri mCurrentUri; 
    private DataSource<CloseableReference<CloseableImage>> mCurrentDataSource; 

    public void setUri(Uri uri) { 
    mCurrentUri = uri; 
    if (mCurrentDatasource != null) { 
     mCurrentDataSource.setUri(uri); 
    } 
    } 

    @Override 
    public DataSource<CloseableReference<CloseableImage>> get() { 
    mCurrentDataSource = new MyDataSource(); 
    mCurrentDataSource.setUri(uri); 
    return mCurrentDataSource; 
    } 

    private class MyDataSource extends AbstractDataSource<CloseableReference<CloseableImage>> { 
    private DataSource mUnderlyingDataSource; 

    @Override 
    protected void closeResult(@Nullable CloseableReference<CloseableImage> result) { 
     CloseableReference.closeSafely(result); 
    } 

    @Override 
    @Nullable 
    public CloseableReference<CloseableImage> getResult() { 
     return CloseableReference.cloneOrNull(super.getResult()); 
    } 


    @Override 
    public boolean close() { 
     if (mUnderlyingDataSource != null) { 
     mUnderlyingDataSource.close(); 
     mUnderlyingDataSource = null; 
     } 
     return super.close(); 
    } 

    public void setUri(Uri uri) { 
     if (mUnderlyingDataSource != null) { 
     mUnderlyingDataSource.close(); 
     mUnderlyingDataSource = null; 
     } 
     if (uri != null && !isClosed()) { 
     mUnderlyingDataSource = Fresco.getImagePipeline().fetchDecodedImage(ImageRequest.fromUri(uri), null); 
     mUnderlyingDataSource.subscribe(new BaseDataSubscriber { 
      @Override 
      protected void onNewResultImpl(DataSource<List<CloseableReference<CloseableImage>>> dataSource) { 
      MyDataSource.super.setResult(dataSource.getResult(), false); 
      } 
     }); 
     } 
    } 
    } 
} 
+1

इसके लिए आपको बहुत बहुत धन्यवाद। मैं इसे अगले हफ्ते एक कोशिश देने जा रहा हूं और आपको परिणामों के बारे में बता दूंगा। – Jimmy

+0

@plamenko आपने नई छवि को लोड करते समय मौजूदा छवि को छिपाने का फैसला क्यों किया? विकल्प प्रदान करना इसे छुपाता है या अधिक उपयोगी नहीं लगता है .. –

+0

@ एंटनमालिसहेव, ऐसा नहीं है कि हमने मौजूदा छवि को प्रति छिपाने का फैसला किया है। यह ड्रैवे डिजाइन का एक परिणाम है। ड्रैवे छवियों को डेटासोर्स से प्रदर्शित करने के लिए प्राप्त करता है (जो बदले में प्रदायक से आता है)। ड्रैवे में केवल एक ही सप्लायर होता है जो डिजाइन को बहुत सरल बनाता है क्योंकि ड्रॉवे नियंत्रक के बजाय वहां मक्सिंग तर्क encapsulated है। ड्रैवे के साथ इस कार्यक्षमता को प्राप्त करने का एक साफ तरीका एक सप्लायर होना है जो ऐसा करता है। – plamenko

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