2013-03-26 15 views
1

當我的android應用程序中點擊一個按鈕時,它會打開相機應用程序。在相機應用程序中拍攝照片時,照片會上傳到服務器。關於android上的圖片上傳查詢

問題:拍攝照片並在相機應用程序中單擊「保存」後,直到照片上傳到服務器纔會返回到應用程序。

這是因爲我正在等待上載圖像的Thread完成。

如何解決這個問題?我希望它從相機應用程序返回到應用程序,並想顯示ProgressBar。

對於我的程序是:

- >使用Intent打開攝像頭應用程序是這樣的:

Intent CameraIntent =new Intent("android.media.action.IMAGE_CAPTURE"); 
startActivityForResult(CameraIntent,CAMERA_PIC_REQUEST); 

- >在該方法中onActivityResult(int requestCode, int resultCode, Intent data),我寫了下面的代碼。我在Base64中編碼圖像,並調用Thread將Base64編碼圖像上傳到服務器。

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    super.onActivityResult(requestCode, resultCode, data); 

    if(requestCode==CAMERA_PIC_REQUEST) 
    { 
      ThumbNail=(Bitmap) data.getExtras().get("data"); 
      ba=new ByteArrayOutputStream(); 

      ThumbNail.compress(Bitmap.CompressFormat.JPEG,100,ba); 
      barray=ba.toByteArray(); 

      str_img=Base64.encodeToString(barray,Base64.DEFAULT);   

      if(resultCode==Activity.RESULT_OK) 
      {    
      upload_image = new ThreadUploadImage(str_img); 

      upload_image.start(); 

      while(upload_image.isAlive()) 
      { 
        Thread.sleep(100); 
      }   
     } 
    } 
} 

ThreadUploadImage.java

public class ThreadUploadImage extends Thread { 

    String str_img,result; 
    String port=null,ip_addr=null; 

    public ThreadUploadImage(String str_img) 
    { 
     this.str_img=str_img; 
    } 

    public void run() 
    { 
     try 
     { 
      HttpClient client =new DefaultHttpClient(); 

      ip_addr=StaticVariables.ip_addr; 
      port=StaticVariables.port; 

      if(ip_addr!=null && port!=null) 
      { 
       List<NameValuePair> l =new ArrayList<NameValuePair>(); 

       l.add(new BasicNameValuePair("img_str",str_img)); 
       post.setEntity(new UrlEncodedFormEntity(l));  
       HttpResponse response=client.execute(post); 

       BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
       StringBuilder builder = new StringBuilder(); 
       for (String line = null; (line = reader.readLine()) != null;) { 
        builder.append(line).append("\n"); 
       } 

       this.result = builder.toString(); 
       Log.e("result_is",result); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

問題:當拍攝照片和「保存」點擊相機應用程序,直到圖片被上傳到服務器時,它沒有返回給應用程序。

這是因爲我正在等待正在上傳圖像的線程。

如何解決這個問題?我希望它從相機應用程序返回到應用程序,並且我想顯示一個ProgressBar。

回答

1

刪除等待Thread完成。如果您需要做任何阻止用戶

while(upload_image.isAlive()) 
{ 
    Thread.sleep(100); 
} 

,如果你需要通知他時,上傳完成後,那麼你應該把一個ProgressDialog有一個不確定的進度指示器(:

刪除此即旋轉等待圖標)。

Thread完成,那麼你就需要通過簡單的回調或廣播和dismiss()ProgressDialog通知你Activity

回調實例

public static interface MyCallback { 
    public void finished(final boolean success); 
} 

你的活動 '工具' myCallBack函數

public class MyActivity implements MyCallback { 
    ... 
    public void finished(final boolean success) { 
     if(success) { 
      // Upload was successful! 
     } else { 
      // Upload failed. 
     } 
    } 
} 

ThreadUploadImage類必須擁有一個MyCallback對象,而且它必須被置爲參數構造函數。然後,當線程完成時,您應該致電mCallback.finished()

public class ThreadUploadImage extends Thread { 

    String str_img,result; 
    String port=null,ip_addr=null; 
    final MyCallback mCallback; 

    public ThreadUploadImage(String str_img, final MyCallback callback) 
    { 
     this.str_img=str_img; 
     mCallback = callback; 
    } 

    public void run() 
    { 
     try 
     { 
      HttpClient client =new DefaultHttpClient(); 

      ... 

      Log.e("result_is",result); 
      mCallback.finished(true); 
     } catch(Exception e) { 
      e.printStackTrace(); 
      mCallback.finished(false); 
     } 
    } 
} 
+0

那我怎麼知道它是否正確地上傳圖像? – abhinav 2013-03-26 20:29:37

+0

你能詳細解釋我如何做一個線程回調或廣播?請不要介意..我對這個android開發非常新穎 – abhinav 2013-03-26 20:34:24

+0

當'ThreadUploadImage'完成時,您將知道上傳是成功還是失敗,取決於在'線程'中是否觸發了'Exception'。有很多方法可以告訴你的Activity'ThreadUploadImage'已經完成。我更喜歡創建一個類似'Listener'或回調的簡單類(具體取決於您是否擁有Java或C背景)。 – 2013-03-26 20:37:08