我是Android应用程序开发的新手,当我按下登录按钮时,我的应用程序崩溃,并给我一个致命的例外,请帮助我。
我还想在软键盘上使用ENTER键而不是登录按钮
登录课程
public class Login extends Activity implements OnClickListener {
private ProgressDialog pDialog;
Button btnLogin;
Button btnLinkToRegister;
EditText inputEmail;
EditText inputPassword;
TextView loginErrorMsg;
// JSON Response node names
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
// Importing all assets like buttons, text fields
inputEmail = (EditText) findViewById(R.id.loginEmail);
inputPassword = (EditText) findViewById(R.id.loginPassword);
btnLogin = (Button) findViewById(R.id.btnLogin);
btnLogin.setOnClickListener(this);
loginErrorMsg = (TextView) findViewById(R.id.login_error);
// Login button Click Event
}
public void onClick(View v)
{
if(v.getId()==R.id.btnLogin)
{
new LoginExecute().execute();
}
}
class LoginExecute extends AsyncTask<String, String, String>
{
String email = inputEmail.getText().toString();
String password = inputPassword.getText().toString();
UserFunctions userFunction = new UserFunctions();
JSONObject json = userFunction.loginUser(email, password);
protected String doInBackground(String... args)
{
try {
if(email.trim().length()>0 || password.trim().length()>0)
{
if (json.getString("STATUS") != null) {
loginErrorMsg.setText("");
String res3 = json.getString("STATUS");
System.out.println("Status = " +res3);
if(Integer.parseInt(res3) == 1){
if (json.getString("role").equalsIgnoreCase("Inspector"))
{
loginErrorMsg.setText("");
String res1 = json.getString("role");
System.out.println("Role =" +res1);
String area = json.getString("area");
String street = json.getString("street");
String user_id = json.getString("user_id");
if(res1.equals("Inspector"))
{
Intent dashboard = new Intent(getApplicationContext(), Inspector.class);
// Close all views before launching Dashboard
dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard);
// finish();
}
}
else if (json.getString("role").equalsIgnoreCase("Clamper"))
{
loginErrorMsg.setText("");
String res1 = json.getString("role");
;
if(res1.equals("Clamper"))
{
Intent dashboard1 = new Intent(getApplicationContext(), Clamper.class);
// Close all views before launching Dashboard
dashboard1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard1);
//finish();
}
}
else if (json.getString("role").equalsIgnoreCase("Declamper"))
{
loginErrorMsg.setText("");
String res22 = json.getString("role");
System.out.println("Role =" +res22);
if(res22.equals("Declamper"))
{
Intent dashboard2 = new Intent(getApplicationContext(), Declamper.class);
// Close all views before launching Dashboard
dashboard2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard2);
//finish();
}
}
else if (json.getString("role").equalsIgnoreCase("Tower"))
{
loginErrorMsg.setText("");
String res8 = json.getString("role");
System.out.println("Role =" +res3);
if(res8.equals("Tower"))
{
Intent dashboard3 = new Intent(getApplicationContext(), Tower.class);
// Close all views before launching Dashboard
dashboard3.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard3);
//finish();
}
}
}else{
// Error in login
loginErrorMsg.setText("Incorrect username/password");
}
}
}else{
loginErrorMsg.setText("Blank username/password");
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
pDialog = new ProgressDialog(Login.this);
pDialog.setMax(25);
pDialog.setMessage("Processing....");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
long delayInMillis = 2000;
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
pDialog.dismiss();
}
}, delayInMillis);
}
}
记录错误文件
08-28 09:08:13.136: W/dalvikvm(1348): threadid=11: thread exiting with uncaught exception (group=0xb2b0cba8)
08-28 09:08:13.276: D/dalvikvm(1348): GC_FOR_ALLOC freed 205K, 7% free 3875K/4156K, paused 35ms, total 35ms
08-28 09:08:13.286: E/AndroidRuntime(1348): FATAL EXCEPTION: AsyncTask #1
08-28 09:08:13.286: E/AndroidRuntime(1348): Process: com.example.testlogin, PID: 1348
08-28 09:08:13.286: E/AndroidRuntime(1348): java.lang.RuntimeException: An error occured while executing doInBackground()
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.os.AsyncTask$3.done(AsyncTask.java:300)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.lang.Thread.run(Thread.java:841)
08-28 09:08:13.286: E/AndroidRuntime(1348): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6094)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:857)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4320)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.view.View.invalidate(View.java:10935)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.view.View.invalidate(View.java:10890)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.widget.TextView.checkForRelayout(TextView.java:6587)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.widget.TextView.setText(TextView.java:3813)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.widget.TextView.setText(TextView.java:3671)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.widget.TextView.setText(TextView.java:3646)
08-28 09:08:13.286: E/AndroidRuntime(1348): at com.example.testlogin.Login$LoginExecute.doInBackground(Login.java:185)
08-28 09:08:13.286: E/AndroidRuntime(1348): at com.example.testlogin.Login$LoginExecute.doInBackground(Login.java:1)
08-28 09:08:13.286: E/AndroidRuntime(1348): at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-28 09:08:13.286: E/AndroidRuntime(1348): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-28 09:08:13.286: E/AndroidRuntime(1348): ... 4 more
答案 0 :(得分:0)
问题在于这些线(和类似的线):
loginErrorMsg.setText("");
AsyncTask旨在在另一个线程中运行,并且您无法从另一个线程修改UI(如果允许则可能非常糟糕)。
您需要创建一个Runnable并在UI线程上运行它,或者在onPostExecute
中执行该代码,就像执行其他UI元素一样。
像这样:
String errorText = "";
private Runnable updateErrorMsg = new Runnable() {
@Override
public void run() {
loginErrorMsg.setText(errorText);
}
};
protected String doInBackground(String... args)
{
try {
if(email.trim().length()>0 || password.trim().length()>0)
{
if (json.getString("STATUS") != null) {
loginErrorMsg.setText("");
String res3 = json.getString("STATUS");
System.out.println("Status = " +res3);
if(Integer.parseInt(res3) == 1){
if (json.getString("role").equalsIgnoreCase("Inspector"))
{
// change to this
errorText = "";
runOnUiThread(updateErrorMsg);
String res1 = json.getString("role");
System.out.println("Role =" +res1);
String area = json.getString("area");
String street = json.getString("street");
String user_id = json.getString("user_id");
if(res1.equals("Inspector"))
{
Intent dashboard = new Intent(getApplicationContext(), Inspector.class);
// Close all views before launching Dashboard
dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard);
// finish();
}
}
else if (json.getString("role").equalsIgnoreCase("Clamper"))
{
// change to this
errorText = "";
runOnUiThread(updateErrorMsg);
String res1 = json.getString("role");
;
if(res1.equals("Clamper"))
{
Intent dashboard1 = new Intent(getApplicationContext(), Clamper.class);
// Close all views before launching Dashboard
dashboard1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard1);
//finish();
}
}
else if (json.getString("role").equalsIgnoreCase("Declamper"))
{
loginErrorMsg.setText("");
String res22 = json.getString("role");
System.out.println("Role =" +res22);
if(res22.equals("Declamper"))
{
Intent dashboard2 = new Intent(getApplicationContext(), Declamper.class);
// Close all views before launching Dashboard
dashboard2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard2);
//finish();
}
}
else if (json.getString("role").equalsIgnoreCase("Tower"))
{
// change to this
errorText = "";
runOnUiThread(updateErrorMsg);
String res8 = json.getString("role");
System.out.println("Role =" +res3);
if(res8.equals("Tower"))
{
Intent dashboard3 = new Intent(getApplicationContext(), Tower.class);
// Close all views before launching Dashboard
dashboard3.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard3);
//finish();
}
}
}else{
// Error in login
// loginErrorMsg.setText("Incorrect username/password");
// change to this
errorText = "Incorrect username/password";
runOnUiThread(updateErrorMsg);
}
}
}else{
// loginErrorMsg.setText("Blank username/password");
// change to this
errorText = "Blank username/password";
runOnUiThread(updateErrorMsg);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
答案 1 :(得分:0)
您无法在setText
TextView
内拨打doInBackground
,您应该在任务完成后更新onPostExecute
内的用户界面,或使用线程更改任务执行期间的UI(不推荐)。
如果您需要显示进度,可以使用onProgressUpdate和publishProgress。