Home activity fail to launch in device after successful login and app would crash. I am able to launch other activities perfectly well. So I believe the problem here lies with my Home activity (and all other activities that contains BottomNavigation).
Can someone point out my mistake? Thanks!
Home.java
public class Home extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
private TextView mTextMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mTextMessage = (TextView) findViewById(R.id.message);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
final PopupMenu popup = new PopupMenu(Home.this, fab);
//Inflating the Popup using xml file
popup.getMenuInflater()
.inflate(R.menu.popup_menu, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(
Home.this,
"You Clicked : " + item.getTitle(),
Toast.LENGTH_SHORT
).show();
return true;
}
});
popup.show(); //showing popup menu
}
});
final ImageButton ib = (ImageButton) findViewById(R.id.ib);
ib.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Creating the instance of PopupMenu
final PopupMenu popup = new PopupMenu(Home.this, ib);
//Inflating the Popup using xml file
popup.getMenuInflater()
.inflate(R.menu.popup_switchgrp, popup.getMenu());
//registering popup with OnMenuItemClickListener
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(
Home.this,
"You Clicked : " + item.getTitle(),
Toast.LENGTH_SHORT
).show();
return true;
}
});
popup.show(); //showing popup menu
}
});
Spinner spinner = findViewById(R.id.spinner1);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.DeviceLocation, android.R.layout.simple_spinner_dropdown_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
mTextMessage.setText(R.string.title_home);
return true;
case R.id.navigation_scenes:
mTextMessage.setText(R.string.title_scenes);
openScenesPage();
return true;
case R.id.navigation_security:
mTextMessage.setText(R.string.title_security);
openSecurityPage();
return true;
case R.id.navigation_myinfo:
mTextMessage.setText(R.string.title_myinfo);
openMyInfoPage();
return true;
}
return true;
}
};
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String text = parent.getItemAtPosition(position).toString();
Toast.makeText(parent.getContext(), text, Toast.LENGTH_SHORT).show();
}
public void onNothingSelected(AdapterView<?> parent) {
}
private void openScenesPage(){
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
private void openSecurityPage(){
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
private void openMyInfoPage(){
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
}
LOGCAT:
2018-11-19 16:46:30.953 1778-1778/? E/adTracker: Value 60172784179-1477976237@g.us of type java.lang.String cannot be converted to JSONObject
--------- beginning of system
2018-11-19 16:46:36.789 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:46:45.009 751-751/? E/cnss-daemon: gateway mac address: %02x:%02x:%02x:%02x:%02x:%02x
: 00:00:00:00:00:00
2018-11-19 16:46:45.010 751-751/? E/cnss-daemon: Invalid mac address: 0x555555f110M
2018-11-19 16:46:49.000 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:46:50.046 16022-16022/? E/ResourcesFlusher: Could not retrieve ResourcesImpl#mDrawableCache field
java.lang.NoSuchFieldException: No field mDrawableCache in class Landroid/content/res/MiuiResourcesImpl; (declaration of 'android.content.res.MiuiResourcesImpl' appears in /system/framework/framework.jar)
at java.lang.Class.getDeclaredField(Native Method)
at android.support.v7.app.ResourcesFlusher.flushNougats(Twttr:141)
at android.support.v7.app.ResourcesFlusher.flush(Twttr:46)
at android.support.v7.app.AppCompatDelegateImplV14.updateForNightMode(Twttr:221)
at android.support.v7.app.AppCompatDelegateImplV14.applyDayNight(Twttr:93)
at android.support.v7.app.AppCompatActivity.onCreate(Twttr:73)
at com.twitter.app.common.base.BaseFragmentActivity.onCreate(Twttr:66)
at com.twitter.app.common.inject.InjectedFragmentActivity.onCreate(Twttr:46)
at com.twitter.app.common.abs.AbsFragmentActivity.onCreate(Twttr:129)
at com.twitter.app.common.base.TwitterFragmentActivity.onCreate(Twttr:158)
at android.app.Activity.performCreate(Activity.java:6875)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2694)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2802)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1549)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6379)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
2018-11-19 16:46:55.228 16022-16022/? E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
2018-11-19 16:46:55.715 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:46:55.862 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.storeANWBufferInMetadata not implemented
2018-11-19 16:46:55.870 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.storeANWBufferInMetadata not implemented
2018-11-19 16:46:55.870 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.configureVideoTunnelMode not implemented
2018-11-19 16:46:55.870 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.useAndroidNativeBuffer is supported
2018-11-19 16:46:55.872 738-2028/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:46:55.873 738-2028/? E/OMXNodeInstance: getConfig(2e200ba:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:46:55.930 738-2028/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:46:55.930 738-2028/? E/OMXNodeInstance: getConfig(2e200ba:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:46:55.964 738-2028/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:46:55.964 738-2028/? E/OMXNodeInstance: getConfig(2e200ba:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:47:00.810 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:47:00.817 2685-2897/? E/WtProcessController: Error pid or pid not exist
2018-11-19 16:47:00.824 2685-2897/? E/WtProcessController: Error pid or pid not exist
2018-11-19 16:47:00.856 15173-15173/? E/SearchServiceClient: SearchServiceClient disposed and cannot be reused.
2018-11-19 16:47:00.861 15173-15173/? E/SearchServiceClient: SearchServiceClient disposed and cannot be reused.
2018-11-19 16:47:00.862 15173-15173/? E/SearchServiceClient: SearchServiceClient disposed and cannot be reused.
2018-11-19 16:47:01.566 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:47:01.572 733-16282/? E/ACDB-LOADER: Error: ACDB AudProc vol returned = -19
2018-11-19 16:47:01.573 733-16282/? E/ACDB-LOADER: Error: ACDB AFE returned = -19
2018-11-19 16:47:01.685 2035-12645/? E/ctxmgr: [ProducerStatusImpl]updateStateForNewContextData: inactive, contextName=7
2018-11-19 16:47:01.888 2035-2035/? E/BeaconBle: Scan couldn't start for Places
2018-11-19 16:47:11.151 15173-16305/? E/DoodleDataUtils: Doodle: bad search_url:
2018-11-19 16:47:11.166 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:47:11.172 733-16322/? E/ACDB-LOADER: Error: ACDB AudProc vol returned = -19
2018-11-19 16:47:11.173 733-16322/? E/ACDB-LOADER: Error: ACDB AFE returned = -19
2018-11-19 16:47:12.121 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:47:12.360 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.storeANWBufferInMetadata not implemented
2018-11-19 16:47:12.366 738-738/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.storeANWBufferInMetadata not implemented
2018-11-19 16:47:12.366 738-738/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.configureVideoTunnelMode not implemented
2018-11-19 16:47:12.366 738-738/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.useAndroidNativeBuffer is supported
2018-11-19 16:47:12.368 738-2028/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:47:12.368 738-2028/? E/OMXNodeInstance: getConfig(2e200bb:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:47:12.405 738-2028/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:47:12.406 738-2028/? E/OMXNodeInstance: getConfig(2e200bb:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:47:12.410 15173-16368/? E/ACodec: Unexpected command completion in ExecutingToIdleState: PortDisable(2) Loaded(1)
2018-11-19 16:47:12.411 15173-16368/? E/ACodec: signalError(omxError 0x80001001, internalError -2147483646)
2018-11-19 16:47:12.411 15173-16367/? E/MediaCodec: Codec reported err 0x80000002, actionCode 0, while in state 10
2018-11-19 16:47:17.581 2035-16289/? E/NetworkScheduler: Invalid component specified.
2018-11-19 16:47:17.602 2035-15450/? E/NetworkScheduler: Invalid component specified.
2018-11-19 16:47:17.631 2035-15450/? E/NetworkScheduler: Invalid component specified.
2018-11-19 16:47:23.592 16342-16342/com.abc.def E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abc.def, PID: 16342
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference
at com.abc.def.LoginActivity.showProgress(LoginActivity.java:245)
at com.abc.def.LoginActivity.attemptLogin(LoginActivity.java:206)
at com.abc.def.LoginActivity.access$000(LoginActivity.java:41)
at com.abc.def.LoginActivity$2.onClick(LoginActivity.java:92)
at android.view.View.performClick(View.java:5647)
at android.view.View$PerformClick.run(View.java:22462)
at android.os.Handler.handleCallback(Handler.java:754)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:163)
at android.app.ActivityThread.main(ActivityThread.java:6379)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
2018-11-19 16:47:23.713 1527-1669/? E/InputDispatcher: channel '272b664 com.abc.def/com.abc.def.LoginActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2018-11-19 16:47:23.714 477-2464/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
2018-11-19 16:47:23.742 2414-2450/? E/octvm_klo: read: Unexpected EOF!
2018-11-19 16:47:23.921 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.storeANWBufferInMetadata not implemented
2018-11-19 16:47:23.928 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.storeANWBufferInMetadata not implemented
2018-11-19 16:47:23.928 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.configureVideoTunnelMode not implemented
2018-11-19 16:47:23.928 738-2028/? E/OMX-VDEC-1080P: Extension: OMX.google.android.index.useAndroidNativeBuffer is supported
2018-11-19 16:47:23.930 738-946/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:47:23.930 738-946/? E/OMXNodeInstance: getConfig(2e200bc:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:47:23.965 15173-15173/? E/SrpContentController: Attach/Detach events sent when controller is already destroyed
2018-11-19 16:47:23.966 15173-15173/? E/SrpContentController: Show/Hide events sent when controller is already destroyed
2018-11-19 16:47:23.982 2035-16290/? E/ctxmgr: [ProducerStatusImpl]updateStateForNewContextData: inactive, contextName=7
2018-11-19 16:47:24.014 15173-15173/? E/SrpContentController: Show/Hide events sent when controller is already destroyed
2018-11-19 16:47:24.026 15173-15173/? E/SrpContentController: Show/Hide events sent when controller is already destroyed
2018-11-19 16:47:24.048 738-946/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:47:24.048 738-946/? E/OMXNodeInstance: getConfig(2e200bc:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:47:24.154 738-2028/? E/OMX-VDEC-1080P: Does not handle dataspace request
2018-11-19 16:47:24.154 738-2028/? E/OMXNodeInstance: getConfig(2e200bc:qcom.decoder.avc, ??(0x7f000062)) ERROR: UnsupportedSetting(0x80001019)
2018-11-19 16:47:24.180 733-16422/? E/ACDB-LOADER: Error: ACDB AudProc vol returned = -19
2018-11-19 16:47:24.181 733-16422/? E/ACDB-LOADER: Error: ACDB AFE returned = -19
2018-11-19 16:47:24.364 2035-2035/? E/BeaconBle: Scan couldn't start for Places
Login.java
public class LoginActivity extends AppCompatActivity implements LoaderCallbacks<Cursor> {
private static final int REQUEST_READ_CONTACTS = 0;
private static final String[] DUMMY_CREDENTIALS = new String[]{
"foo@example.com:hello", "bar@example.com:world"
};
private UserLoginTask mAuthTask = null;
// UI references.
private AutoCompleteTextView mEmailView;
private EditText mPasswordView;
private View mProgressView;
private View mLoginFormView;
private Button mSignInButton;
private Button mForgotPasswordButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
// Set up the login form.
mEmailView = (AutoCompleteTextView) findViewById(R.id.email);
populateAutoComplete();
mPasswordView = (EditText) findViewById(R.id.password);
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) {
attemptLogin();
return true;
}
return false;
}
});
Button mSignInButton = (Button) findViewById(R.id.sign_in_button);
mSignInButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
attemptLogin();
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
}
});
final Button mForgotPasswordButton = (Button) findViewById(R.id.forgot_password_button);
mForgotPasswordButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
openForgotPassword();
}
});
}
private void populateAutoComplete() {
if (!mayRequestContacts()) {
return;
}
getLoaderManager().initLoader(0, null, this);
}
private boolean mayRequestContacts() {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return true;
}
if (checkSelfPermission(READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
return true;
}
if (shouldShowRequestPermissionRationale(READ_CONTACTS)) {
Snackbar.make(mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE)
.setAction(android.R.string.ok, new View.OnClickListener() {
@Override
@TargetApi(Build.VERSION_CODES.M)
public void onClick(View v) {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
});
} else {
requestPermissions(new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS);
}
return false;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == REQUEST_READ_CONTACTS) {
if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
populateAutoComplete();
}
}
}
private void attemptLogin() {
if (mAuthTask != null) {
return;
}
// Reset errors.
mEmailView.setError(null);
mPasswordView.setError(null);
// Store values at the time of the login attempt.
String email = mEmailView.getText().toString();
String password = mPasswordView.getText().toString();
boolean cancel = false;
View focusView = null;
// Check for a valid password, if the user entered one.
if (!TextUtils.isEmpty(password) && !isPasswordValid(password)) {
mPasswordView.setError(getString(R.string.error_invalid_password));
focusView = mPasswordView;
cancel = true;
}
else if (TextUtils.isEmpty(password)) {
mPasswordView.setError("Password is empty");
focusView = mPasswordView;
cancel = true;
}
// Check for a valid email address.
if (TextUtils.isEmpty(email)) {
mEmailView.setError(getString(R.string.error_field_required));
focusView = mEmailView;
cancel = true;
} else if (!isEmailValid(email)) {
mEmailView.setError(getString(R.string.error_invalid_email));
focusView = mEmailView;
cancel = true;
}
if (cancel) {
// There was an error; don't attempt login and focus the first
// form field with an error.
focusView.requestFocus();
} else {
// Show a progress spinner, and kick off a background task to
// perform the user login attempt.
showProgress(true);
mAuthTask = new UserLoginTask(email, password);
mAuthTask.execute((Void) null);
}
}
private boolean isEmailValid(String email) {
//TODO: Replace this with your own logic
return email.contains("@") && email.contains(".");
}
private boolean isPasswordValid(String password) {
//TODO: Replace this with your own logic
return password.length() > 4;
}
private void openForgotPassword(){
Intent intent = new Intent(this, ForgotPasswordActivity.class);
startActivity(intent);
}
public void startHome(){
Intent intent = new Intent(this, Home.class);
startActivity(intent);
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
private void showProgress(final boolean show) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
int shortAnimTime = getResources().getInteger(android.R.integer.config_shortAnimTime);
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
mLoginFormView.animate().setDuration(shortAnimTime).alpha(
show ? 0 : 1).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
});
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
mProgressView.animate().setDuration(shortAnimTime).alpha(
show ? 1 : 0).setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
}
});
} else {
mProgressView.setVisibility(show ? View.VISIBLE : View.GONE);
mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
}
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
return new CursorLoader(this,
// Retrieve data rows for the device user's 'profile' contact.
Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY), ProfileQuery.PROJECTION,
// Select only email addresses.
ContactsContract.Contacts.Data.MIMETYPE +
" = ?", new String[]{ContactsContract.CommonDataKinds.Email
.CONTENT_ITEM_TYPE},
ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
List<String> emails = new ArrayList<>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
emails.add(cursor.getString(ProfileQuery.ADDRESS));
cursor.moveToNext();
}
addEmailsToAutoComplete(emails);
}
@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
}
private void addEmailsToAutoComplete(List<String> emailAddressCollection) {
//Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
ArrayAdapter<String> adapter =
new ArrayAdapter<>(LoginActivity.this,
android.R.layout.simple_dropdown_item_1line, emailAddressCollection);
mEmailView.setAdapter(adapter);
}
private interface ProfileQuery {
String[] PROJECTION = {
ContactsContract.CommonDataKinds.Email.ADDRESS,
ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
};
int ADDRESS = 0;
int IS_PRIMARY = 1;
}
/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
private final String mEmail;
private final String mPassword;
UserLoginTask(String email, String password) {
mEmail = email;
mPassword = password;
}
@Override
protected Boolean doInBackground(Void... params) {
// TODO: attempt authentication against a network service.
try {
// Simulate network access.
Thread.sleep(2000);
} catch (InterruptedException e) {
return false;
}
for (String credential : DUMMY_CREDENTIALS) {
String[] pieces = credential.split(":");
if (pieces[0].equals(mEmail)) {
// Account exists, return true if the password matches.
return pieces[1].equals(mPassword);
}
}
// TODO: register the new account here.
return true;
}
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
startHome();
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
@Override
protected void onCancelled() {
mAuthTask = null;
showProgress(false);
}
}
}
Actually you initialize mProgressView
and mLoginFormView
in mSignInButton
click . This is bad practice and make NPE so i'm suggest add move initialize of these two view two onCreate() and remove from onClickListener
like the following.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
//other codes
}
Hope it's help
you are using mProgressView and mLoginFormView before you give them the value.
@Override
public void onClick(View view) {
attemptLogin();
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
}
From crash log it is obvious attemptLogin will use mProgressView which is only set after. so probably this will work:
@Override
public void onClick(View view) {
mLoginFormView = findViewById(R.id.login_form);
mProgressView = findViewById(R.id.login_progress);
attemptLogin();
}
Radesh's answer may also work.
User contributions licensed under CC BY-SA 3.0