在我的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。
答案 0 :(得分:1)
删除等待Thread
完成。
删除它:
while(upload_image.isAlive())
{
Thread.sleep(100);
}
如果您需要阻止用户执行任何操作,并且在上传完成时需要通知他,那么您应该使用不确定的进度指示器(即旋转等待图标)设置ProgressDialog
。< / p>
Thread
完成后,您需要通过简单的回调或广播通知Activity
,dismiss()
ProgressDialog
。
回调示例:
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);
}
}
}