ฉันจะสนับสนุนวิธีการจัดการปัญหาการหมุนครั้งนี้ สิ่งนี้อาจไม่เกี่ยวข้องกับ OP เนื่องจากเขาไม่ได้ใช้AsyncTask
แต่คนอื่นอาจเห็นว่ามีประโยชน์ มันค่อนข้างง่าย แต่ดูเหมือนว่าจะทำงานให้ฉัน:
ฉันมีกิจกรรมเข้าสู่ระบบด้วยซ้อนกันระดับที่เรียกว่าAsyncTask
BackgroundLoginTask
ในของฉันBackgroundLoginTask
ฉันไม่ได้ทำอะไรออกจากสามัญยกเว้นที่จะเพิ่มการตรวจสอบ null เมื่อเรียกProgressDialog
's ยกเลิก:
@Override
protected void onPostExecute(Boolean result)
{
if (pleaseWaitDialog != null)
pleaseWaitDialog.dismiss();
[...]
}
นี่คือการจัดการกรณีที่งานพื้นหลังเสร็จสิ้นในขณะที่Activity
มองไม่เห็นและดังนั้นการโต้ตอบความคืบหน้าได้รับการออกโดยonPause()
วิธีการ
ต่อไปในActivity
ชั้นเรียนผู้ปกครองของฉันฉันสร้างตัวจัดการแบบคงที่ทั่วโลกให้กับAsyncTask
ชั้นเรียนของฉันและของฉันProgressDialog
( AsyncTask
การซ้อนกันสามารถเข้าถึงตัวแปรเหล่านี้):
private static BackgroundLoginTask backgroundLoginTask;
private static ProgressDialog pleaseWaitDialog;
สิ่งนี้มีจุดประสงค์สองประการ: ประการแรกมันช่วยให้ฉันActivity
สามารถเข้าถึงAsyncTask
วัตถุได้ตลอดเวลาแม้จะเป็นกิจกรรมใหม่หลังการหมุน ประการที่สองจะอนุญาตให้ฉันBackgroundLoginTask
เข้าถึงและยกเลิกการProgressDialog
หมุนได้แม้ในภายหลัง
ถัดไปฉันเพิ่มสิ่งนี้ลงไปonPause()
ทำให้กล่องโต้ตอบความคืบหน้าหายไปเมื่อเราActivity
ออกจากเบื้องหน้า (ป้องกันไม่ให้เกิดความผิดพลาด "force close" ที่น่าเกลียด):
if (pleaseWaitDialog != null)
pleaseWaitDialog.dismiss();
ในที่สุดฉันมีดังต่อไปนี้ในonResume()
วิธีการของฉัน:
if ((backgroundLoginTask != null) && (backgroundLoginTask.getStatus() == Status.RUNNING))
{
if (pleaseWaitDialog != null)
pleaseWaitDialog.show();
}
สิ่งนี้ทำให้Dialog
สามารถปรากฏขึ้นอีกครั้งหลังจากที่Activity
ถูกสร้างขึ้นใหม่
นี่คือทั้งชั้นเรียน:
public class NSFkioskLoginActivity extends NSFkioskBaseActivity {
private static BackgroundLoginTask backgroundLoginTask;
private static ProgressDialog pleaseWaitDialog;
private Controller cont;
// This is the app entry point.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (CredentialsAvailableAndValidated())
{
//Go to main menu and don't run rest of onCreate method.
gotoMainMenu();
return;
}
setContentView(R.layout.login);
populateStoredCredentials();
}
//Save current progress to options when app is leaving foreground
@Override
public void onPause()
{
super.onPause();
saveCredentialsToPreferences(false);
//Get rid of progress dialog in the event of a screen rotation. Prevents a crash.
if (pleaseWaitDialog != null)
pleaseWaitDialog.dismiss();
}
@Override
public void onResume()
{
super.onResume();
if ((backgroundLoginTask != null) && (backgroundLoginTask.getStatus() == Status.RUNNING))
{
if (pleaseWaitDialog != null)
pleaseWaitDialog.show();
}
}
/**
* Go to main menu, finishing this activity
*/
private void gotoMainMenu()
{
startActivity(new Intent(getApplicationContext(), NSFkioskMainMenuActivity.class));
finish();
}
/**
*
* @param setValidatedBooleanTrue If set true, method will set CREDS_HAVE_BEEN_VALIDATED to true in addition to saving username/password.
*/
private void saveCredentialsToPreferences(boolean setValidatedBooleanTrue)
{
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES, MODE_PRIVATE);
SharedPreferences.Editor prefEditor = settings.edit();
EditText usernameText = (EditText) findViewById(R.id.editTextUsername);
EditText pswText = (EditText) findViewById(R.id.editTextPassword);
prefEditor.putString(USERNAME, usernameText.getText().toString());
prefEditor.putString(PASSWORD, pswText.getText().toString());
if (setValidatedBooleanTrue)
prefEditor.putBoolean(CREDS_HAVE_BEEN_VALIDATED, true);
prefEditor.commit();
}
/**
* Checks if user is already signed in
*/
private boolean CredentialsAvailableAndValidated() {
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES,
MODE_PRIVATE);
if (settings.contains(USERNAME) && settings.contains(PASSWORD) && settings.getBoolean(CREDS_HAVE_BEEN_VALIDATED, false) == true)
return true;
else
return false;
}
//Populate stored credentials, if any available
private void populateStoredCredentials()
{
SharedPreferences settings = getSharedPreferences(APP_PREFERENCES,
MODE_PRIVATE);
settings.getString(USERNAME, "");
EditText usernameText = (EditText) findViewById(R.id.editTextUsername);
usernameText.setText(settings.getString(USERNAME, ""));
EditText pswText = (EditText) findViewById(R.id.editTextPassword);
pswText.setText(settings.getString(PASSWORD, ""));
}
/**
* Validate credentials in a seperate thread, displaying a progress circle in the meantime
* If successful, save credentials in preferences and proceed to main menu activity
* If not, display an error message
*/
public void loginButtonClick(View view)
{
if (phoneIsOnline())
{
EditText usernameText = (EditText) findViewById(R.id.editTextUsername);
EditText pswText = (EditText) findViewById(R.id.editTextPassword);
//Call background task worker with username and password params
backgroundLoginTask = new BackgroundLoginTask();
backgroundLoginTask.execute(usernameText.getText().toString(), pswText.getText().toString());
}
else
{
//Display toast informing of no internet access
String notOnlineMessage = getResources().getString(R.string.noNetworkAccessAvailable);
Toast toast = Toast.makeText(getApplicationContext(), notOnlineMessage, Toast.LENGTH_SHORT);
toast.show();
}
}
/**
*
* Takes two params: username and password
*
*/
public class BackgroundLoginTask extends AsyncTask<Object, String, Boolean>
{
private Exception e = null;
@Override
protected void onPreExecute()
{
cont = Controller.getInstance();
//Show progress dialog
String pleaseWait = getResources().getString(R.string.pleaseWait);
String commWithServer = getResources().getString(R.string.communicatingWithServer);
if (pleaseWaitDialog == null)
pleaseWaitDialog= ProgressDialog.show(NSFkioskLoginActivity.this, pleaseWait, commWithServer, true);
}
@Override
protected Boolean doInBackground(Object... params)
{
try {
//Returns true if credentials were valid. False if not. Exception if server could not be reached.
return cont.validateCredentials((String)params[0], (String)params[1]);
} catch (Exception e) {
this.e=e;
return false;
}
}
/**
* result is passed from doInBackground. Indicates whether credentials were validated.
*/
@Override
protected void onPostExecute(Boolean result)
{
//Hide progress dialog and handle exceptions
//Progress dialog may be null if rotation has been switched
if (pleaseWaitDialog != null)
{
pleaseWaitDialog.dismiss();
pleaseWaitDialog = null;
}
if (e != null)
{
//Show toast with exception text
String networkError = getResources().getString(R.string.serverErrorException);
Toast toast = Toast.makeText(getApplicationContext(), networkError, Toast.LENGTH_SHORT);
toast.show();
}
else
{
if (result == true)
{
saveCredentialsToPreferences(true);
gotoMainMenu();
}
else
{
String toastText = getResources().getString(R.string.invalidCredentialsEntered);
Toast toast = Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT);
toast.show();
}
}
}
}
}
ฉันไม่ได้เป็นนักพัฒนา Android ที่มีประสบการณ์ดังนั้นโปรดแสดงความคิดเห็น