2016-07-16 3 views
1

フォームの詳細と画像をリモートサーバーに送信するアプリを作成しています。詳細は、ユーザーがカメラから取得できる編集テキストと画像から得ることができるテキストが含まれていますまたはギャラリー。 私が問題を抱えているのは、一度クリックするとすぐに無効にする必要がある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){後の最初のステートメントとしてのボタンを無効にする必要があり

+1

あなたのスタックトレースを投稿して記入してくださいボタンを再度有効にすることができます失敗した場合、それは再び をクリックすることはできませんそして、この

 bSubmit.setEnabled(false); 

を置きますあなたのコードのどの行が例外を生成していますか。 –

答えて

0

私はアンドロイドのスタジオで取得していますエラーです。

+0

ありがとうございます。しかし、主な問題はjava.lang.illegalStateExceptionです。あなたはそれで私を助けてくれますか?再度、感謝します。 – user2546419

+0

あなたのlogcatを掲示 – Hank

0

コードの後半までカウンターをインクリメントしているため、ボタンが無効になっていません。すぐのonClickを入力すると() - あなたの転送は、あなたがして

+0

ありがとう。もう一度編集を確認できますか? – user2546419

関連する問題