我必须关闭应用程序并再次打开Android文件上传工作

时间:2014-10-26 08:15:16

标签: java android multipartform-data

我有一个Android应用程序,它记录一个音频文件并将其上传到API进行指纹识别。该应用程序第一次上传并获得正确的响应时效果很好。但是,在尝试再次上传时,来自应用程序的请求似乎在没有上传文件的情况下到达服务器。奇怪的是,当我完全关闭应用程序并再次打开它时,它运行良好。但是,我希望它能够连续上传,而不必在每次尝试后关闭它。

这是我的代码:

public class MainActivity extends Activity {

   class UploadFileTask extends AsyncTask<Void, Void, String> {

   @Override
   protected String doInBackground(Void... voids) {
      String responseString = "";
      HttpResponse response = null;
      try {
         //below is the API url
         String url = "http://1**.**.**.**:8000/api/tag/";
         File track = new File(Environment.getExternalStorageDirectory(), "mezzo.mp3");
         HttpClient httpclient = new DefaultHttpClient();
         HttpPost httppost = new HttpPost(url);
         MultipartEntityBuilder reqEntity = MultipartEntityBuilder.create();
         reqEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

         FileBody fb = new FileBody(track);
         //InputStream inputStream = new ;
         //reqEntity.addPart("track", fb);
         reqEntity.addBinaryBody("track", track);
         final HttpEntity myEntity = reqEntity.build();
         httppost.setEntity(myEntity);
         Log.i("request", String.valueOf(myEntity));
         response = httpclient.execute(httppost);

         //process response
         responseString = new BasicResponseHandler().handleResponse(response);
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (ClientProtocolException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      } finally {
         if (null!=response)
         {
             try
             {
                HttpEntity httpEntity = response.getEntity();
                if (null != httpEntity)
                {
                   httpEntity.consumeContent();
                }
             } catch (IOException e) {
                e.printStackTrace();
             }
         }
     }
     return responseString;
  }

  protected void onPostExecute(final String responseString) {
     runOnUiThread(new Thread() {
        public void run() {
           Toast.makeText(getApplicationContext(),
                          responseString, Toast.LENGTH_LONG).show();
        }
     });
  }

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我不确定,但我怀疑http响应可能不会被完全消耗掉。

在从finally块中的函数返回之前,您是否可以尝试使用响应:

finally
{
    if (null!=response)
    {
        try
        {
            HttpEntity httpEntity = response.getEntity();
            if (null != httpEntity)
            {
                httpEntity.consumeContent();
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}