2014-04-25 36 views
0

我正在開發一個應用程序,允許用戶上傳媒體文件(如圖片,照片,視頻)到服務器,我有一個大的文件有點問題 - 太長等待並查看活動進度條,同時其上傳和另一個問題 - 如果應用程序死亡上傳死亡,所以我需要將我的上傳代碼轉移到服務。所以在這裏我的麻煩開始了 - 如果我將我的上傳代碼傳輸到服務器,我如何發送進度更新(%)到活動?上傳文件到服務器的背景

,這裏是我上傳的方法的代碼:

public static void uploadMovie(final HashMap<String, String> dataSource, final OnResponseListener finishedListener, final ProgressListener progressListener) { 
    if (finishedListener != null) { 
     new Thread(new Runnable() { 
      public void run() { 
       try { 

        //Prepare data--> 

        String boundary = getMD5(dataSource.size() + String.valueOf(System.currentTimeMillis())); 
        MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create(); 
        multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
        multipartEntity.setCharset(Charset.forName("UTF-8")); 
        for (String key : dataSource.keySet()) { 
         if (key.equals(MoviesFragmentAdd.USERFILE)) { 
          FileBody userFile = new FileBody(new File(dataSource.get(key))); 
          multipartEntity.addPart(key, userFile); 
          continue; 
         } 
         multipartEntity.addPart(key, new StringBody(dataSource.get(key), ContentType.APPLICATION_JSON)); 
        } 
        HttpEntity entity = multipartEntity.build(); 
        //<-- 

        //Prepare Connection--> 

        trustAllHosts(); 
        HttpsURLConnection conn = (HttpsURLConnection) new URL(SAKH_URL_API + "/video/addForm/").openConnection(); 
        conn.setUseCaches(false); 
        conn.setDoOutput(true); 
        conn.setDoInput(true); 
        conn.setRequestMethod("POST"); 
        conn.setRequestProperty("Accept-Charset", "UTF-8"); 
        conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary); 
        conn.setRequestProperty("Content-length", entity.getContentLength() + ""); 
        conn.setRequestProperty(entity.getContentType().getName(), entity.getContentType().getValue()); 
        conn.connect(); 


        //<-- 
        // Upload--> 


        OutputStream os = conn.getOutputStream(); 
        ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        entity.writeTo(baos); 
        baos.close(); 
        byte[] payload = baos.toByteArray(); 
        baos = null; 
        int totalSize = payload.length; 
        int bytesTransferred = 0; 
        int chunkSize = 2000; 

        while (bytesTransferred < totalSize) { 
         int nextChunkSize = totalSize - bytesTransferred; 
         if (nextChunkSize > chunkSize) { 
          nextChunkSize = chunkSize; 
         } 
         os.write(payload, bytesTransferred, nextChunkSize); 
         bytesTransferred += nextChunkSize; 

         //Progress update--> 
         if (progressListener != null) { 
          progressListener.onProgressUpdate((100 * bytesTransferred/totalSize)); 
         } 
         //<-- 

        } 

        os.flush(); 

        //<-- 
        //Get server response--> 
        int status = conn.getResponseCode(); 
        if (conn.getResponseCode() == HttpsURLConnection.HTTP_OK) { 

         BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
         JsonObject request = (JsonObject) gparser.parse(in.readLine()); 

         if (!request.get("error").getAsBoolean()) { 
          finishedListener.onLoadFinished(new Object()); 
         } 
        } else { 
         throw new IOException("Server returned non-OK status: " + status); 
        } 

        conn.disconnect(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
        finishedListener.onNotConnected(); 

       } 
      } 
     }).start(); 

    } 
} 

回答

1

1 - 創建一個可綁定服務,並實施必要的活頁夾

之前結合,或在其他情況下,啓動您的服務,如果您的應用程序被關閉服務也將關閉

2 - 在服務上公開像StartDownload(url,IUpdateTarget)這樣的公共函數。

3-使用UpdateProgress(somevalues)函數創建接口(IUpdateTarget);

4實現在查看IUpdateTarget接口應該收到更新通知

5綁定到服務並檢索正在運行的服務的實例

6 - 現在,你有你的服務的情況下,調用StartDownload傳遞URL和目標視圖以獲取通知。

7-當您必須將服務調用中的接口從傳遞給服務的IUpdateProgress實例(目標視圖)更新到UpdateProgress時。

注意跨線程調用,請記住,您必須始終更新主線程上的接口。

+0

十分感謝您的回答,我會嘗試,因爲你寫的。 – whizzzkey

+0

不客氣。此外,請記住,當您的服務正在下載東西或設備可以進入睡眠模式時進行電源鎖定。 – Gusman

1

使用處理器發送過程

new Thread(new Runnable() { 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
     android.os.Message msg = new android.os.Message(); 
     Bundle bundle = new Bundle(); 
     bundle.putInt("process", process); 
     msg.setData(bundle); 
     mHandler.sendMessage(msg); 
    } 
}).start(); 

Handler mHandler = new Handler() { 
    public void handleMessage(android.os.Message msg) { 
     int process = msg.getData().getInt("process"); 
    }; 
}; 
+0

好主意! THX =) – whizzzkey