为什么我的android应用程序会出现非法状态例外

为什么我的android应用程序会出现非法状态例外,android,android-volley,Android,Android Volley,因此,我正在创建一个应用程序,将表单详细信息和图像发送到远程服务器。这些详细信息包括一些文本,我可以从编辑文本中获取,用户可以从相机或图库中获取。 我遇到的问题是提交按钮(bSubmit),我需要在单击一次后立即将其禁用。问题是它确实会被禁用,但经过一段时间后,用户有很多时间反复单击它,并多次向服务器发送相同的信息。 但我第一次单击“提交”时,相同的数据被发送了两次。有没有具体的原因 此外,我还得到java.lang.illegalStateException.Current线程必须有一个循环器

因此,我正在创建一个应用程序,将表单详细信息和图像发送到远程服务器。这些详细信息包括一些文本,我可以从编辑文本中获取,用户可以从相机或图库中获取。 我遇到的问题是提交按钮(bSubmit),我需要在单击一次后立即将其禁用。问题是它确实会被禁用,但经过一段时间后,用户有很多时间反复单击它,并多次向服务器发送相同的信息。
但我第一次单击“提交”时,相同的数据被发送了两次。有没有具体的原因

此外,我还得到java.lang.illegalStateException.Current线程必须有一个循环器,如果我再次尝试单击bSubmit按钮

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;
    }
}
公共类MainActivity扩展了ActionBarActivity实现了View.OnClickListener{
私有编辑名;
私人按钮b、b、b、b提交;
私有ImageView imReceipt;
int count=1;//计算单击按钮的次数;
私有字符串上载\u URL=”http://some_url.com";
私有位图;
文件;
Uri文件\u Uri\u摄像机;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etName=(EditText)findViewById(R.id.etName);
bGallery=(按钮)findViewById(R.id.bGallery);
bTakePhoto=(按钮)findViewById(R.id.bTakePhoto);
bSubmit=(按钮)findViewById(R.id.bSubmit);
imreceipt=(ImageView)findViewById(R.id.imreceipt);
bGallery.setOnClickListener(此);
bTakePhoto.setOnClickListener(此);
b submit.setOnClickListener(此);
}
@凌驾
公共void onClick(视图v){
如果(v==bGallery){//20
Intent i=新的Intent(Intent.ACTION\u PICK、MediaStore.Images.Media.EXTERNAL\u CONTENT\u URI);
startActivityForResult(i,20);
}
如果(v==bTakePhoto){//10
意向i=新意向(MediaStore.ACTION\u IMAGE\u CAPTURE);
getFileUri();
i、 putExtra(MediaStore.EXTRA\u输出,文件uri\u摄像头);
startActivityForResult(i,10);
}
if(v==bSubmit){
StringRequest StringRequest=新建StringRequest(Request.Method.POST,UPLOAD\u URL,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串s){
Toast.makeText(MainActivity.this,“数据已成功发送!”,
Toast.LENGTH_LONG).show();
}
},
新的Response.ErrorListener(){
@凌驾
公共错误响应(截击错误截击错误){
Toast.makeText(MainActivity.this,volleyError.getMessage(),
Toast.LENGTH_LONG).show();
}
}){
@凌驾
受保护的映射getParams()引发AuthFailureError{
//将位图转换为字符串
字符串图像=getStringImage(位图);
字符串名称=etName.getText().toString().trim();
//创建参数
Map params=新哈希表();
//添加参数
参数put(“图像”,图像);
参数put(“名称”,名称);
//这就是主要问题所在
如果(计数>1){
b submit.setEnabled(false);
}
计数++;
//返回参数
返回参数;
}
};
//创建请求队列
RequestQueue RequestQueue=Volley.newRequestQueue(this);
//将请求添加到队列
添加(stringRequest);
}
}
//为拍摄的图像创建文件Uri
私有void getFileUri(){
//将刚拍摄的照片保存到SD卡中
字符串image_name=“testing123.jpg”;
file=新文件(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u PICTURES)+file.separator
+图像(名称);
file\u uri\u camera=uri.fromFile(文件);
}
@凌驾
受保护的void onActivityResult(int请求代码、int结果代码、意图数据){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==10&&resultCode==RESULT\u确定){
//Uri selectedImage=data.getData();
//imreceipt.setImageURI(selectedImage);
bitmap=BitmapFactory.decodeFile(file_uri_camera.getPath());
imreceipt.setImageBitmap(位图);
}
if(requestCode==20&&resultCode==RESULT\u OK&&data!=null){
Uri selectedImage=data.getData();
试一试{
//从库中获取位图
位图=MediaStore.Images.Media.getBitmap(getContentResolver(),selectedImage);
//将位图设置为ImageView
imreceipt.setImageBitmap(位图);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
公共字符串getStringImage(位图bmp){
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG,50,baos);
byte[]imageBytes=bas.toByteArray();
字符串encodedImage=Base64.encodeToString(imageBytes,Base64.DEFAULT);
返回图像;
}
}
谢谢你的帮助。我非常感激

此外,如果你能想出任何其他可以改进的方案,请告诉我。我对android应用程序开发还是新手。任何帮助都是应用程序
      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)
                bSubmit.setEnabled(false);