フォームの詳細と画像をリモートサーバーに送信するアプリを作成しています。詳細は、ユーザーがカメラから取得できる編集テキストと画像から得ることができるテキストが含まれていますまたはギャラリー。 私が問題を抱えているのは、一度クリックするとすぐに無効にする必要があるSubmitボタン(bSubmit)です。問題はそれが無効になることですが、ユーザーに何度も何度も何度もクリックして同じ情報を複数回サーバーに送信する時間を多く与えた後です。
しかし、私が最初にbSubmitをクリックすると、同じデータが2回送信されています。それには特別な理由はありますか?私のアンドロイドアプリがillegalStateExceptionを返すのはなぜですか
また、bSubmitボタンを再度クリックしようとすると、java.lang.illegalStateException.Currentスレッドにルーパーが必要です。
public class MainActivity extends ActionBarActivity implements View.OnClickListener{
private EditText etName;
private Button bGallery,bTakePhoto,bSubmit;
private ImageView imReciept;
int count = 1; // To count the number of button clicks;
private String UPLOAD_URL ="http://some_url.com";
private Bitmap bitmap;
File file;
Uri file_uri_camera;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etName = (EditText) findViewById(R.id.etName);
bGallery = (Button) findViewById(R.id.bGallery);
bTakePhoto = (Button) findViewById(R.id.bTakePhoto);
bSubmit = (Button) findViewById(R.id.bSubmit);
imReciept = (ImageView) findViewById(R.id.imReciept);
bGallery.setOnClickListener(this);
bTakePhoto.setOnClickListener(this);
bSubmit.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v == bGallery){ //20
Intent i = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i,20);
}
if(v == bTakePhoto){ //10
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
getFileUri();
i.putExtra(MediaStore.EXTRA_OUTPUT, file_uri_camera);
startActivityForResult(i,10);
}
if(v == bSubmit){
StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
Toast.makeText(MainActivity.this, "Data Successfully sent!",
Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Toast.makeText(MainActivity.this, volleyError.getMessage(),
Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//Converting Bitmap to String
String image = getStringImage(bitmap);
String name = etName.getText().toString().trim();
//Creating parameters
Map<String,String> params = new Hashtable<String, String>();
//Adding parameters
params.put("image", image);
params.put("name", name);
//THIS is where the main problem is happening
if(count >1){
bSubmit.setEnabled(false);
}
count++;
//returning parameters
return params;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(stringRequest);
}
}
//Creates a file Uri for the image taken
private void getFileUri() {
//saves the photo just taken into sdcard
String image_name = "testing123.jpg";
file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + File.separator
+ image_name);
file_uri_camera = Uri.fromFile(file);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == 10 && resultCode == RESULT_OK){
//Uri selectedImage = data.getData();
//imReciept.setImageURI(selectedImage);
bitmap = BitmapFactory.decodeFile(file_uri_camera.getPath());
imReciept.setImageBitmap(bitmap);
}
if(requestCode == 20 && resultCode == RESULT_OK && data != null){
Uri selectedImage = data.getData();
try {
//Getting the Bitmap from Gallery
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage);
//Setting the Bitmap to ImageView
imReciept.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String getStringImage(Bitmap bmp){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 50, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
return encodedImage;
}
}
ありがとうございました。私はそれを多く感謝します。
また、プログラムで改善できることを考えることができる場合は教えてください。私はまだアンドロイドアプリの開発に新しいです。どんな助けもありがとうございます。
編集 - なぜ質問に-1が表示されますか?
編集は、2-
07-17 00:00:23.918 15105-15441/com.example.username.nic_volley E/Volley﹕ [14460] NetworkDispatcher.run: Unhandled exception java.lang.IllegalStateException: The current thread must have a looper!
java.lang.IllegalStateException: The current thread must have a looper!
at android.view.Choreographer$1.initialValue(Choreographer.java:96)
at android.view.Choreographer$1.initialValue(Choreographer.java:91)
at java.lang.ThreadLocal$Values.getAfterMiss(ThreadLocal.java:460)
at java.lang.ThreadLocal.get(ThreadLocal.java:65)
at android.view.Choreographer.getInstance(Choreographer.java:192)
at android.animation.ValueAnimator$AnimationHandler.<init>(ValueAnimator.java:656)
at android.animation.ValueAnimator$AnimationHandler.<init>(ValueAnimator.java:631)
at android.animation.ValueAnimator.getOrCreateAnimationHandler(ValueAnimator.java:1453)
at android.animation.ValueAnimator.cancel(ValueAnimator.java:1057)
at android.animation.AnimatorSet.cancel(AnimatorSet.java:335)
at android.animation.StateListAnimator.cancel(StateListAnimator.java:192)
at android.animation.StateListAnimator.setState(StateListAnimator.java:176)
at android.view.View.drawableStateChanged(View.java:15988)
at android.widget.TextView.drawableStateChanged(TextView.java:3659)
at android.support.v7.widget.AppCompatButton.drawableStateChanged(AppCompatButton.java:143)
at android.view.View.refreshDrawableState(View.java:16032)
at android.view.View.setEnabled(View.java:6724)
at android.widget.TextView.setEnabled(TextView.java:1446)
at com.example.username.nic_volley.MainActivity$3.getParams(MainActivity.java:133)
at com.android.volley.Request.getBody(Request.java:397)
at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:236)
at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:210)
at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:106)
at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:93)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:105)
これは、あなたがif(v == bSubmit){
後の最初のステートメントとしてのボタンを無効にする必要があり
あなたのスタックトレースを投稿して記入してくださいボタンを再度有効にすることができます失敗した場合、それは再び をクリックすることはできませんそして、この
を置きますあなたのコードのどの行が例外を生成していますか。 –