के साथ एक फ़ाइल डाउनलोड और लिखें मैं रेट्रोफिट के साथ एक पीडीएफ फ़ाइल डाउनलोड कर रहा हूं, जिस तरह से मैं इसे डाउनलोड कर रहा हूं, वह ब्लॉक है। मैं बाइट्स की एक श्रृंखला प्राप्त करने के लिए Content-Range
शीर्षलेख का उपयोग करता हूं, फिर मुझे इन बाइट्स को file
पर लिखने की आवश्यकता है, समस्या उन्हें लिखने का आदेश है। मैं flatMap()
फ़ंक्शन का उपयोग कर रहा हूं ताकि फ़ाइल डाउनलोड करने के लिए प्रत्येक अनुरोध के लिए एक अवलोकन योग्य हो सके।रेट्रोफिट और आरएक्सजेवा
.flatMap(new Func1<Integer, Observable<Response>>() {
@Override
public Observable<Response> call(Integer offset) {
int end;
if (offset + BLOCK_SIZE > (contentLength - 1))
end = (int) contentLength - 1 - offset;
else
end = offset + BLOCK_SIZE;
String range = getResources().getString(R.string.range_format, offset, end);
return ApiAdapter.getApiService().downloadPDFBlock(range);
}
})
downloadPDFBlock
एक तार है कि एक शीर्ष लेख के लिए आवश्यक है प्राप्त करते हैं: Range: bytes=0-3999
। तो फिर मैं समारोह सदस्यता ले बाइट्स लिखने के लिए इस्तेमाल डाउनलोड किया
subscribe(new Subscriber<Response>() {
@Override
public void onCompleted() {
Log.i(LOG_TAG, file.getAbsolutePath());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Response response) {
writeInCache(response);
}
}
});
लेकिन समस्या यह है कि लेखन की प्रक्रिया अव्यवस्थित बना है। उदाहरण के लिए: यदि Range: bytes=44959-53151
पहले डाउनलोड किया गया है, तो यह बाइट होगा जो फ़ाइल में पहले लिखा जाएगा। मैंने BlockingObserver
पढ़ा है लेकिन मुझे नहीं पता कि यह समाधान हो सकता है या नहीं।
मुझे आशा है कि आप मेरी मदद कर सकते हैं।
चेक 'concatMap' ऑपरेटर http://fernandocejas.com/2015/01/11/rxjava-observable-tranformation-concatmap-vs-flatmap/ –
वैकल्पिक रूप से, एक RandomAccessFile का उपयोग करें और ऑफसेट एक ही फाइल में लिखने अनुरोध के लिए बनाया गया था। – akarnokd
आपको बड़ी सामग्री लोड करने के लिए DownloadManager का उपयोग करना चाहिए। http://developer.android.com/reference/android/app/DownloadManager.html –