2012-04-28 6 views
1

私は自分のサーバーに画像をアップロードするAsyncTaskを持っています。この部分はうまくいきますが、中断する処理をどのように処理するのか分かりません。私はキャンセル可能なProgressDialogとキャンセル時のリスナーを持っています。このリスナーでは、httpリクエストとAsyncTaskを中止します...しかし、イメージがまだアップロードされているので、それは十分ではないようです。ここ は私のコードがどのように見えるかです:サーバー上の画像のアップロードを中止する

public class UploadCubeThread extends AsyncTask<Cube, Void, String> { 

private static final String url = "http://www.mywebsite.com/upload_cube.php"; 
private volatile HttpPost httppost = new HttpPost(url); 
private ProgressDialog waitSpinner; 
private Context context; 
private HashMap<String, Integer> feedback; 
private boolean success = false; 

public UploadCubeThread(Context context) { 
    this.context = context; 
    this.feedback = new HashMap<String, Integer>(); 
    waitSpinner = new ProgressDialog(context); 
    // Cancelable 
    waitSpinner.setCancelable(true); 
    waitSpinner.setCanceledOnTouchOutside(false); 
    waitSpinner.setOnCancelListener(new OnCancelListener() { 
     public void onCancel(DialogInterface dialog) { 
      httppost.abort(); 
      UploadCubeThread.this.cancel(true); 
     } 
    }); 
} 

@Override 
protected void onCancelled() { 
    super.onCancelled(); 
    success = false; 
    feedback.put("cancelled", 0); 
    ((UploadListener) context).onUploadComplete(success, feedback); 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    waitSpinner.setMessage(context.getString(R.string.uploading)); 
    waitSpinner.show(); 
} 

@Override 
protected String doInBackground(Cube... arg0) { 

    Cube cube = arg0[0]; 
    String result = null; 
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    // Compression 
    cube.getImage().compress(Bitmap.CompressFormat.JPEG, 100, stream); 

    byte[] byte_arr = stream.toByteArray(); 
    String image_str = Base64.encodeBytes(byte_arr); 
    ArrayList<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(); 
    // Hash md5 pour l'intégrité 
    String hash = CubeUploader.encode(image_str); 

    nameValuePairs.add(new BasicNameValuePair("image", image_str)); 
    nameValuePairs.add(new BasicNameValuePair("id_building", String 
      .valueOf(cube.getId_building()))); 
    nameValuePairs.add(new BasicNameValuePair("title", cube.getTitle())); 
    nameValuePairs 
      .add(new BasicNameValuePair("content", cube.getContent())); 
    nameValuePairs.add(new BasicNameValuePair("hash", hash)); 

    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, 
       HTTP.UTF_8)); 

     HttpResponse response = httpclient.execute(httppost); 


     // Utilisation de la réponse 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent(), "UTF-8")); 
     result = reader.readLine(); 

    } catch (UnknownHostException he) { 
     Log.e("CubeUpload", "Unknown Host : problem of connectivity ?"); 
     result = "host_pb"; 
    } catch (Exception e) { 
     Log.e("CubeUpload", "Error during upload: " + e.toString()); 
    } 
    return result; 

} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
//Some process 
    ((UploadListener) context).onUploadComplete(success, feedback); 
    waitSpinner.dismiss(); 
} 
} 

はあなたの助けのためにありがとうございました!

答えて

0

私はポイントがhttppost.abort(); が十分でないと、接続が完全に閉じていないことだと思います(それは私が、それはサーバ側に処理することがあります何をしたいのです)ので、私は後httpclient.getConnectionManager().shutdown();を追加しようとしましたが、それは、画像ではない方が良いでしょうまだアップロードされています! ...私は理解していません

+0

私は同じ問題に直面している! ...あなたはこれに対する解決策を見つけることができましたか? – Shatazone

+0

yeah me 2解決策を見つけたら同じ問題があります –

関連する問題