使用AndroidAsyncHttp上传大文件在一段时间后从android失败

时间:2016-05-01 15:45:46

标签: android file-upload android-async-http

我正在尝试使用AsyncHttpClient上传文件.Below是代码:

public class uploadVideoAsyncTask extends AsyncTask<String,Void,JSONObject>{
    Context context;
    SyncHttpClient client;
    JSONObject response;

    public uploadVideoAsyncTask(Context context) {
        this.context = context;
    }

    @Override
    protected JSONObject doInBackground(String... params) {
        if(client != null){
            RequestParams data = new RequestParams();
            File video = new File(params[0]);
            try {
                data.put("upload", video, "video/*");
                Log.d("debug", LoginActivity.URL + LoginActivity.URL_UPLOAD_VIDEO);
                client.post(LoginActivity.URL+LoginActivity.URL_UPLOAD_VIDEO,data,new JsonHttpResponseHandler(){

                    @Override
                    public void onProgress(long bytesWritten, long totalSize) {
                        super.onProgress(bytesWritten, totalSize);
                        Log.d("debug",bytesWritten +"  "+ totalSize);
                    }

                    @Override
                    public void onUserException(Throwable error) {
                        super.onUserException(error);
                        Log.d("debug",error.toString());
                    }

                    @Override
                    public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
                        super.onSuccess(statusCode, headers, response);
                        Log.d("debug", response.toString());
                        initializeResponse(response);
                    }

                    @Override
                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
                        super.onFailure(statusCode, headers, throwable, errorResponse);
                        Log.d("debug", errorResponse.toString());
                        initializeResponse(errorResponse);
                    }

                    @Override
                    public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
                        super.onFailure(statusCode, headers, responseString, throwable);
                        Log.d("debug", responseString);
                        initializeResponse(null);
                    }
                });
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                initializeResponse(null);
            }

        }else{
            initializeResponse(null);
        }
        return  this.response;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        initializeHttpClient();
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);
        Log.d("debug","ererr");
    }

    private void initializeResponse(JSONObject response){
        this.response = response;
    }

    private void initializeHttpClient(){
        if(client == null){
            client  = new SyncHttpClient();
            //client.setMaxRetriesAndTimeout(LoginActivity.maxRetries, LoginActivity.TIME_OUT);
            client.setTimeout(50000);
            Log.d("debug", client.getResponseTimeout() + "");
            Log.d("debug", client.getConnectTimeout()+"");
            client.addHeader("x-access-token", "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI1NzFiOTBmOTM4ZmQ1NzA4MGUzMTY1Y2IifQ.2l4DVRTVhxFnD796M5CPIEloGW6N-qBnXxa3lC0XDRU");
            //client.addHeader("Content-Type", " application/json");
        }
    }

}

如果文件上传花费的时间非常短,大​​约1分钟,则此代码可以正常工作,但如果文件大小更大并且需要更多时间。 AsyncHttpclient在一段时间后停止上传文件而没有任何错误。

我已尝试使用不同的setTimeOut。 服务器端也没有错误。使用高级休息客户端,我可以加载任何文件大小。

谢谢

1 个答案:

答案 0 :(得分:0)

Set
 RequestParams data = new RequestParams();
if (file != null && file.exists())
  data.put("Db_file", new FileInputStream(file));
  data.setForceMultipartEntityContentType(true);

RequestParams类创建一个非缓冲的ByteArrayEntity以传递给POST或PUT调用,很容易导致OutOfMemory错误的文件较大,例如将视频或mp3上传到服务器时,通常大于4或5 MB。