java - Se debe llamar al método getText() desde el subproceso de interfaz de usuario(Android Studio)
(5)
A menos que haya cambiado algo de lo que no estoy al tanto, eso no debería ser un problema. Los elementos de la interfaz de usuario no se pueden actualizar desde el fondo, pero acceder a sus captadores nunca ha sido un problema.
De todos modos, puede evitar esto agregando un constructor a su
AsyncTask
que tomaría las dos
String
y luego las enviaría al crear su tarea.
private class Login extends AsyncTask<String, String, String>{
// member variables of the task class
String uName, pwd
public Login(String userName, String password) {
uName = userName;
pwd = password;
}
@Override
protected String doInBackground(String... args) {...}
y
onClick()
en tu
onClick()
@Override
public void onClick(View arg0) {
// execute method invokes doInBackground() where we open a Http URL connection using the given Servlet URL
//and get output response from InputStream and return it.
// pass them here
new Login(uname.getText().toString(), password.getText().toString()).execute();
}
Estoy tratando de crear un inicio de sesión para una aplicación. Sin embargo tengo un problema.
Este es mi código:
package com.forgetmenot.loginregister;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
EditText uname, password;
Button submit;
// Creating JSON Parser object
JSONParser jParser = new JSONParser();
private static final String TAG = "Login";
JSONObject json;
private static String url_login = "http://localhost:8080/ForgetMeNotApplication/Login";
//JSONArray incoming_msg = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewsById();
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// execute method invokes doInBackground() where we open a Http URL connection using the given Servlet URL
//and get output response from InputStream and return it.
new Login().execute();
}
});
}
private void findViewsById() {
uname = (EditText) findViewById(R.id.txtUser);
password = (EditText) findViewById(R.id.txtPass);
submit = (Button) findViewById(R.id.login);
}
private class Login extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... args) {
// Getting username and password from user input
String username = uname.getText().toString();
String pass = password.getText().toString();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("u",username));
params.add(new BasicNameValuePair("p",pass));
json = jParser.makeHttpRequest(url_login, "GET", params);
String s=null;
try {
s= json.getString("info");
Log.d("Msg", json.getString("info"));
if(s.equals("success")){
Intent login = new Intent(getApplicationContext(), home.class);
login.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(login);
finish();
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Android Studio dice que el método
getText()
debe llamarse desde el subproceso de la interfaz de usuario en las instrucciones:
uname.getText().toString();
y
password.getText().toString();
¿¿Soluciones posibles??
Estás accediendo al hilo de la interfaz de usuario desde un hilo de fondo aquí:
String username = uname.getText().toString();
String pass = password.getText().toString();
Lo que desea hacer es pasar las cadenas de nombre de usuario / contraseña a su constructor de tareas en segundo plano o podría pasarlas directamente al método de ejecución. Prefiero definirlos en el constructor si van a ser necesarios (como los suyos).
Defina su inicio de sesión
String uname;
String password;
public Login(String username, String password({
this.uname = username;
this.password = password;
}
Luego, en doInBackground () usas los miembros en su lugar.
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("u",this.username));
params.add(new BasicNameValuePair("p",this.pass));
json = jParser.makeHttpRequest(url_login, "GET", params);
Editar: para que su nueva llamada Login (). Execute () se vea más así
new Login(uname.getText().toString(), password.getText().toString()).execute();
Intente pasar sus valores a
Login AsyncTask
mediante el
Login AsyncTask
execute(param1, param1, ..., paramN)
:
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
String username = uname.getText().toString();
String pass = password.getText().toString();
new Login().execute(username, pass);
}
});
}
private void findViewsById() {
uname = (EditText) findViewById(R.id.txtUser);
password = (EditText) findViewById(R.id.txtPass);
submit = (Button) findViewById(R.id.login);
}
private class Login extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... args) {
// Getting username and password from user input
String username = args[0];
String pass = args[1];
La excepción se produce porque
doInBackground()
se invoca desde un subproceso de fondo.
Agregaría dos parámetros de cadena al constructor de su clase de
Login
de
Login
.
Me gustaría aconsejarle que obtenga más conocimiento sobre
AsyncTasks
y Threading en Android.
Por ejemplo, hay una página en los documentos oficiales:
http://developer.android.com/guide/components/processes-and-threads.html
.
También puede echar un vistazo a este curso: https://www.udacity.com/course/developing-android-apps--ud853 . Puedes aprender muchos conceptos básicos del marco de Android.
haga que el
username
y
pass
clase de
login
variable y anule
onPreExcecute()
y haga esto:
@Override
protected void onPreExecute() {
username = uname.getText().toString();
pass = password.getText().toString();
}