2016-09-08 9 views
5

पर समानांतर अपलोड कर रहा है मैं अमेज़ॅन एस 3 सर्वर पर छवि अपलोड करने के लिए ट्रांसफर यूटिलिटी का उपयोग कर रहा हूं। मैं 3 छवियों को एक-एक करके अपलोड करने की कोशिश कर रहा हूं लेकिन यह समानांतर अपलोड कर रहा है। मैं छवियों को एक-एक करके अपलोड करना चाहता हूं। मैं इसे कैसे करूं? मैं अपलोड करने के लिए इस नीचे दिए गए कोड का उपयोग कर रहा:छवि एस 3 सर्वर

private void uploadToAWS(TransferUtility transferUtility,final ArrayList<File> imageFileArrayList){ 

    final ArrayList<String> uploadedFileArrayList = new ArrayList<>(); 
    final ArrayList<String> failedFileArrayList = new ArrayList<>(); 

    for(int i = 0; i < imageFileArrayList.size(); i++) { 

     final File file = imageFileArrayList.get(i); 
     final TransferObserver observer = transferUtility.upload(
       Constants.S3_BUCKET_NAME,    /* The bucket to upload to */ 
       "Test_Images" + file.getAbsolutePath(), /* The key for the uploaded object */ 
       file          /* The file where the data to upload exists */ 
     ); 
     observer.setTransferListener(new TransferListener() { 

       @Override 
       public void onStateChanged(int id, TransferState state) { 
        System.out.println("Id:- " + id); 
        if (state == TransferState.COMPLETED) { 
         uploadedFileArrayList.add(observer.getAbsoluteFilePath()); 
        } else if (state == TransferState.FAILED) { 
         failedFileArrayList.add(file.getAbsolutePath()); 
        } 
       } 

       @Override 
       public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { 
        int percent = (int) ((bytesCurrent * 100)/bytesTotal); 
        System.out.println("percent:- " + percent); 
       } 

       @Override 
       public void onError(int id, Exception ex) { 
        ex.printStackTrace(); 
        System.out.println("Id:- " + id + " in exception"); 
       } 
      }); 

    } 

} 

इस समारोह मैं Asynctask में बोल रहा हूँ।

@Override       
protected Void doInBackground(Void... params) { 

AmazonS3 amazonS3 = new AmazonS3Client(getAWSCredentials()); 

TransferUtility transferUtility = new TransferUtility(amazonS3, context); 

uploadToAWS(transferUtility, imageFileArrayList); 

return null; 

} 

कृपया मदद करें।

+0

कोड पोस्ट करें जहां आप 'AsyncTask' बना रहे हैं। आप शायद 3 'AsyncTask' बना रहे हैं और एक ही समय में उन सभी को निष्पादित कर रहे हैं। – Abbas

+0

मैं इसे मुख्य क्रिया से केवल एक बार बुला रहा हूं। नया अपलोड ImageInBackground (mContext, fileArrayList) .execute(); –

उत्तर

1

ठीक है तो यह मुद्दा है: आप uploadToAWS() में लूप से transferUtility.upload() पर कॉल कर रहे हैं। अब आप पहली फ़ाइल अपलोड के लिए कॉल करते हैं, लेकिन पूरा होने के इंतजार के बिना (चूंकि आपने इसे लूप में रखा है) आप लूप के माध्यम से फिर से चलते हैं और अगली फाइल अपलोड करने के लिए कॉल करते हैं, इसलिए और आगे ...

अब इससे बचने के लिए, आपको केवल TransferState.COMPLETED इवेंट कॉलबैक की प्रतीक्षा करनी है और एक बार आपके पास होने के बाद, आपको अगली फ़ाइल अपलोड (किसी अन्य कॉल के माध्यम से transferUtility.upload() पर कॉल करना चाहिए)।

यदि आप TransferState.FAILED कॉलबैक में अपलोड विफल होने पर भी रीट्रीज़ के लिए कुछ कोड जोड़ना चाहते हैं।

तो अपने कोड मोटे तौर पर तो जैसे हो जाता है:

private void uploadToAWS(TransferUtility transferUtility,final ArrayList<File> imageFileArrayList) { 

    final File file = imageFileArrayList.get(i); 
    final TransferObserver observer = transferUtility.upload(
      Constants.S3_BUCKET_NAME,    /* The bucket to upload to */ 
      "Test_Images" + file.getAbsolutePath(), /* The key for the uploaded object */ 
      file          /* The file where the data to upload exists */ 
    ); 
    observer.setTransferListener(new TransferListener() { 

      @Override 
      public void onStateChanged(int id, TransferState state) { 
       System.out.println("Id:- " + id); 
       if (state == TransferState.COMPLETED) { 
        uploadedFileArrayList.add(observer.getAbsoluteFilePath()); 

        failedFileArrayList.remove(file.getAbsolutePath()); 
        i++; 
        uploadToAWS(transferUtility, imageFileArrayList); 
       } else if (state == TransferState.FAILED) { 
        failedFileArrayList.add(file.getAbsolutePath()); 
        uploadToAWS(transferUtility, imageFileArrayList); 
       } 
      } 

      @Override 
      public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) { 
       int percent = (int) ((bytesCurrent * 100)/bytesTotal); 
       System.out.println("percent:- " + percent); 
      } 

      @Override 
      public void onError(int id, Exception ex) { 
       failedFileArrayList.add(file.getAbsolutePath()); 
       ex.printStackTrace(); 
       System.out.println("Id:- " + id + " in exception"); 
      } 
     }); 

    } 

} 

यह वही अपने कोड दिखाई देती हैं इसका बहुत किसी न किसी तरह कार्यान्वयन है। आप अपने पूरे प्रवाह को बदलना चाहते हैं जो निश्चित रूप से बेहतर है।

+0

पहली छवि अपलोड करने के बाद, ट्रांसफरस्टेट.कंपप्लेटेड स्थिति में अपलोड ToAWS() विधि को फिर से कॉल करना, फिर पर्यवेक्षक ट्रांसफर लिस्टर सेट करने में असमर्थ है। मुझे नहीं पता कि यह क्यों हो रहा है? –

+0

मैं उस स्थिति के आखिर में पर्यवेक्षक.कलैन ट्रांसफर लिस्टर() लिख रहा था। मैं इस लाइन को हटा देता हूँ। अब यह काम करता है। धन्यवाद अब्बास। –