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