android - una - Usando AsyncTask
oncancelled asynctask android (1)
Sería algo como esto
public class TalkToServer extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
/*
* do things before doInBackground() code runs
* such as preparing and showing a Dialog or ProgressBar
*/
}
@Override
protected void onProgressUpdate(Void... values) {
/*
* updating data
* such a Dialog or ProgressBar
*/
}
@Override
protected Void doInBackground(Void... params) {
//do your work here
return null;
}
@Override
protected void onPostExecute(Void result) {
/*
* do something with data here
* display it or send to mainactivity
* close any dialogs/ProgressBars/etc...
*/
}
}
Entonces puedes ejecutarlo con
TalkToServer myTask = new MyTask(); // can add params for a constructor if needed
myTask.execute(); // here is where you would pass data to doInBackground()
Puede que no necesite onProgressUpdate()
o onPreExecute()
si no los está usando para mostrar un Dialog
, progreso u otras tareas antes o durante doInBackground()
.
onPreExecute () se puede usar para inicializar y mostrar un ProgressDialog
. Entonces podría descartarse en onPostExecute()
Después de una tarea termina
onPostExecute()
se llamará. Si la clase es una clase interna de su Activity
, puede actualizar los elementos de la UI
allí o llamar a una función para ejecutar el código una vez que la tarea finaliza. Si se trata de un archivo separado de la Activity
entonces puede usar una interface
y crear una callBack
de callBack
a la Activity
y ejecutar el código una vez que la tarea finalice.
Esta respuesta habla sobre el uso de una interfaz para una devolución de llamada si necesita
Asegúrese de que cualquier actualización de UI
se realice en cualquier método además de doInBackground()
o se envíe de vuelta a la Activity
en cualquier función además de doInBackground()
. El levantamiento de pesas como las operaciones de red se debe hacer en doInBackground()
.
Además, asegúrese de leer los documentos AsyncTask por completo. Especialmente las reglas de Threading
Disculpas si esta es una pregunta simple, pero soy muy nuevo en esto y sigo aprendiendo.
Tengo una aplicación y cuando mis usuarios hacen clic en el botón para iniciar sesión después de ingresar sus detalles, se está bloqueando con android.os.NetworkOnMainThreadException He descubierto que esto se debe a que estoy realizando una operación de red en el hilo principal y para resolverlo necesito usar AsyncTask, sin embargo estoy atascado con la sintaxis.
Aquí está mi código después de hacer clic en el botón, llama a una función para conectarse y luego analiza json en sqlite db.
// Login button Click Event
btnLogin.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
String email = inputEmail.getText().toString();
String password = inputPassword.getText().toString();
UserFunctions userFunction = new UserFunctions();
JSONObject json = userFunction.loginUser(email, password);
// check for login response
try {
if (json.getString(KEY_SUCCESS) != null) {
loginErrorMsg.setText("");
String res = json.getString(KEY_SUCCESS);
if(Integer.parseInt(res) == 1){
// user successfully logged in
// Store user details in SQLite Database
DatabaseHandler db = new DatabaseHandler(getApplicationContext());
JSONObject json_user = json.getJSONObject("user");
// Clear all previous data in database
userFunction.logoutUser(getApplicationContext());
db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));
// Launch Dashboard Screen
Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class);
// Close all views before launching Dashboard
dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(dashboard);
// Close Login Screen
finish();
}else{
// Error in login
loginErrorMsg.setText("Incorrect username/password");
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
¿Cómo cambio esto a la clase correcta? No estoy pasando URL, etc. Creo que tiene que ser algo como esto, pero realmente estoy luchando por obtener la sintaxis correcta.
¡¡¡Muchas gracias!!!
class login extends AsyncTask<Void, Void, Void> {
private Exception exception;
protected ??? doInBackground(???) {
try {