2016-02-04 174 views
0

我已经使用asynctask实现带进度条的上传文件,但大文件或上传多个文件挂断了我的活动,现在我想要做同样的事情,但使用服务而不是使用asynctask。这里是我的代码..Android使用服务进度条上传文件到服务器

private class UploadFileToServer extends AsyncTask<Void, Integer, String> { 

     @Override 
     protected void onPreExecute() { 
      // setting progress bar to zero 
      mBuilder.setProgress(100, 0, false); 
      mNotifyManager.notify(0, mBuilder.build()); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 
      mBuilder.setProgress(100, 
        Integer.parseInt(String.valueOf(progress[0])), false); 
      mNotifyManager.notify(0, mBuilder.build()); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      return uploadFile(); 
     } 

     private String uploadFile() { 
      String responseString = null; 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(***); 

      try { 
       AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
         new AndroidMultiPartEntity.ProgressListener() { 
          public void transferred(long num) { 
           publishProgress((int) ((num/(float) totalSize) * 100)); 
          } 
         }); 

       File sourceFile = new File(orignal1); 
       entity.addPart("image", new FileBody(sourceFile)); 
       totalSize = entity.getContentLength(); 
       httppost.setEntity(entity); 

       // Making server call 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity r_entity = response.getEntity(); 

       int statusCode = response.getStatusLine().getStatusCode(); 
       if (statusCode == 200) { 
        // Server response 
        responseString = EntityUtils.toString(r_entity); 
       } else { 
        responseString = "Error occurred! Http Status Code: " 
          + statusCode; 
       } 

      } catch (ClientProtocolException e) { 
       responseString = e.toString(); 
      } catch (IOException e) { 
       responseString = e.toString(); 
      } 
      return responseString; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
     mBuilder.setContentText("Upload complete").setProgress(0, 0,false); 
      mNotifyManager.notify(6532365, mBuilder.build()); 
      mNotifyManager.cancel(6532365); 
      super.onPostExecute(result); 
     } 
    } 
+0

服务也运行在主线程所以如果u想要做繁重的操作建议里面使用AsynTask服务也。 – kevz

+0

@kevz但服务不允许使用Asynctask –

+0

当然可以。谷歌它多一点,我相信你会找到一个解决方案。 – kevz

回答

0

嘿,我终于做到了这里是代码

public class UploadFile extends Service { 

    NotificationManager mNotifyManager; 
    NotificationCompat.Builder mBuilder; 
    private static final String TAG = "HelloService"; 

    private boolean isRunning = false; 

    @Override 
    public void onCreate() { 
     Log.i(TAG, "Service onCreate"); 

     isRunning = true; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     mBuilder = new NotificationCompat.Builder(UploadFile.this); 
     mBuilder.setContentTitle("File uploaded").setSmallIcon(
       R.drawable.myicons); 
     UpadtePost(); 
     return Service.START_STICKY; 
    } 
    private void UpadtePost() { 

     new UploadFileToServer().execute(); 
    } 
    private class UploadFileToServer extends AsyncTask<Void, Integer, String> { 

     protected void onPreExecute() { 
      // setting progress bar to zero 
      mBuilder.setProgress(100, 0, false); 
      mNotifyManager.notify(0, mBuilder.build()); 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onProgressUpdate(Integer... progress) { 
      mBuilder.setProgress(100, 
        Integer.parseInt(String.valueOf(progress[0])), false); 
      mNotifyManager.notify(0, mBuilder.build()); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      return uploadFile(); 
     } 

     private String uploadFile() { 
      String responseString = null; 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(****); 

      try { 
       AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
         new AndroidMultiPartEntity.ProgressListener() { 
          public void transferred(long num) { 
           publishProgress((int) ((num/(float) totalSize) * 100)); 
          } 
         }); 

       File sourceFile = new File(orignal1); 
       entity.addPart("image", new FileBody(sourceFile)); 
       totalSize = entity.getContentLength(); 
       httppost.setEntity(entity); 

       // Making server call 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity r_entity = response.getEntity(); 

       int statusCode = response.getStatusLine().getStatusCode(); 
       if (statusCode == 200) { 
        // Server response 
        responseString = EntityUtils.toString(r_entity); 
       } else { 
        responseString = "Error occurred! Http Status Code: " 
          + statusCode; 
       } 

      } catch (ClientProtocolException e) { 
       responseString = e.toString(); 
      } catch (IOException e) { 
       responseString = e.toString(); 


      } 
      return responseString; 

     } 

     @Override 
     protected void onPostExecute(String result) { 
       session.showNot(result); 
       mBuilder.setContentText("Upload complete").setProgress(0, 0,false); 
       mNotifyManager.notify(6532365, mBuilder.build()); 
       mNotifyManager.cancel(6532365); 
      super.onPostExecute(result); 
     } 
    } 
    @Override 
    public IBinder onBind(Intent arg0) { 
     Log.i(TAG, "Service onBind"); 
     return null; 
    } 

    @Override 
    public void onDestroy() { 

     isRunning = false; 

     Log.i(TAG, "Service onDestroy"); 
    } 
} 

AndroidMultiPartEntity的.java

public class AndroidMultiPartEntity extends MultipartEntity 

{ 

    private final ProgressListener listener; 

    public AndroidMultiPartEntity(final ProgressListener listener) { 
     super(); 
     this.listener = listener; 
    } 

    public AndroidMultiPartEntity(final HttpMultipartMode mode, 
            final ProgressListener listener) { 
     super(mode); 
     this.listener = listener; 
    } 

    public AndroidMultiPartEntity(HttpMultipartMode mode, final String boundary, 
            final Charset charset, final ProgressListener listener) { 
     super(mode, boundary, charset); 
     this.listener = listener; 
    } 

    @Override 
    public void writeTo(final OutputStream outstream) throws IOException { 
     super.writeTo(new CountingOutputStream(outstream, this.listener)); 
    } 

    public static interface ProgressListener { 
     void transferred(long num); 
    } 

    public static class CountingOutputStream extends FilterOutputStream { 

     private final ProgressListener listener; 
     private long transferred; 

     public CountingOutputStream(final OutputStream out, 
            final ProgressListener listener) { 
      super(out); 
      this.listener = listener; 
      this.transferred = 0; 
     } 

     public void write(byte[] b, int off, int len) throws IOException { 
      out.write(b, off, len); 
      this.transferred += len; 
      this.listener.transferred(this.transferred); 
     } 

     public void write(int b) throws IOException { 
      out.write(b); 
      this.transferred++; 
      this.listener.transferred(this.transferred); 
     } 
    } 
相关问题