1

私のAndroidアプリケーションでボタンをクリックすると、カメラアプリケーションが開きます。カメラアプリケーションで写真を撮ると、その写真がサーバーにアップロードされます。

問題:写真を撮影し、カメラアプリケーションで[保存]をクリックすると、写真がサーバーにアップロードされるまでアプリケーションに戻りません。

これはThread、画像のアップロードが完了するのを待っているためです。

この問題を解決する方法は?カメラアプリケーションからアプリケーションに戻り、プログレスバーを表示したい。

そのための私の手順は:

->Intent次のようにカメラアプリケーションを開くために使用します。

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

->メソッドonActivityResult(int requestCode, int resultCode, Intent data)では、次のコードを記述しました。ThreadBase64で画像をエンコードし、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();
            }
        }
    }

問題:写真を撮影し、カメラアプリケーションで[保存]をクリックすると、写真がサーバーにアップロードされるまでアプリケーションに戻りません。

これは、画像をアップロードしているスレッドを待っているためです。

この問題を解決する方法は?カメラアプリケーションからアプリケーションに戻したいのですが、プログレスバーを表示したいと思います。

4

1 に答える 1

1

終了するまでの待機を削除しThreadます。

これを削除します:

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

ユーザーが何もしないようにブロックする必要があり、アップロードが終了したときにユーザーに通知する必要がある場合はProgressDialog、不確定な進行状況インジケーター(つまり、回転する待機アイコン)を表示する必要があります。

が完了したら、簡単なコールバックまたはブロードキャストとを介してThread通知する必要があります。Activitydismiss()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);
        }
    }
}
于 2013-03-26T20:28:41.363 に答える