El método getText () debe ser llamado desde el subproceso de interfaz de usuario (Android Studio)

Estoy intentando 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); } } 

El estudio de Android dice que el método getText() debe ser llamado desde el subproceso de interfaz de usuario en las istrucciones: uname.getText().toString(); y password.getText().toString(); ¿¿Soluciones posibles??

Trate de pasar Sus valores a Login AsyncTask de 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]; 

make username y pass la variable de clase de login y reemplazar onPreExcecute() y hacer esto:

  @Override protected void onPreExecute() { username = uname.getText().toString(); pass = password.getText().toString(); } 

Estás accediendo al hilo de la interfaz de usuario desde un subproceso de fondo aquí:

 String username = uname.getText().toString(); String pass = password.getText().toString(); 

Lo que quieres hacer es simplemente pasar las cadenas de nombre de usuario / contraseña a tu constructor de tareas en segundo plano o puedes pasarlas directamente al método execute. Prefiero definirlos en el constructor si van a ser requeridos (como los suyos).

Defina su LoginTask como

 String uname; String password; public Login(String username, String password({ this.uname = username; this.password = password; } 

A continuación, en doInBackground () utiliza 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 – entonces su nueva llamada de login (). Execute () se parecería más a esto

 new Login(uname.getText().toString(), password.getText().toString()).execute(); 

A menos que algo haya cambiado que no conozco, eso no debería ser un problema. Elementos de la interfaz de usuario no se pueden actualizar desde el fondo, pero el acceso a sus getters nunca ha sido un problema.

De todos modos, puede evitar esto agregando un constructor a su AsyncTask que tomaría los dos String s luego enviarlos 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 pasarlos en su 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(); } 

La excepción se doInBackground() 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 . Usted puede aprender un montón de conceptos básicos del marco de Android.

  • ¿Qué es List <?> En Java (Android)?
  • Java MTP biblioteca que funciona en Windows
  • GetContext () no existe
  • Retrofit "java.net.ProtocolException: Línea de estado inesperado", ¿Alguien?
  • Enviar puntuaciones a las tablas de clasificación de Google Play Games y mostrar nuevos rangos
  • Cambiar valores en matriz no se propaga en la aplicación
  • Componentes de arquitectura de Android subprocesos de red
  • ¿Tiene OpenStreetMap punto (fuente) a punto (destino) dirección uri para utilizar en Android?
  • ¿Cómo agregar publicidad Admob en mi aplicación de Android?
  • ¿Por qué el cargador de clases de Android permite un acceso reflexivo al campo público de una clase privada de paquete de otro paquete?
  • Instalación de Android, apk INSTALL_FAILED_POLICY_REJECTED_PERMISSION
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.