La méthode getText() doit être appelée à partir de la Thread d'INTERFACE utilisateur (Android Studio)
Je suis en train de créer une connexion pour une application. Toutefois, j'ai un problème.
C'est mon code:
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 dit que la méthode getText()
doit être appelée à partir de la Thread d'INTERFACE utilisateur à la istructions: uname.getText().toString();
et password.getText().toString();
solutions Possibles??
OriginalL'auteur Daniele Oriana | 2015-08-14
Vous devez vous connecter pour publier un commentaire.
Essayer de transmettre Vos valeurs à
Login AsyncTask
viaexecute(param1, param1, ..., paramN)
méthode:OriginalL'auteur dieter_h
faire
username
etpass
login
variable de classe et de remplaceronPreExcecute()
et ce faire:OriginalL'auteur Rustam
Vous avez accès au thread de l'INTERFACE utilisateur à partir d'un thread d'arrière-plan ici:
Ce que vous voulez faire est de simplement transmettre le nom d'utilisateur/mot de passe cordes à votre tâche en arrière-plan, le constructeur ou vous pouvez passer directement à la méthode execute. Je préfère définir dans le constructeur si elles sont nécessaires (comme la vôtre).
Définir votre LoginTask comme
Puis dans doInBackground() vous utilisez les membres à la place.
Edit - alors votre nouveau Login().execute() appel ressemblerait plus à ce
OriginalL'auteur Vinny K
À moins que quelque chose a changé, je ne suis pas au courant, cela ne devrait pas être un problème. Éléments de l'INTERFACE utilisateur ne peut pas être mis à jour à partir de l'arrière-plan, mais d'accéder à leurs accesseurs n'a jamais été un problème.
De toute façon, vous pouvez contourner ce problème en ajoutant un constructeur à votre
AsyncTask
qui prendrait les deuxString
s à envoyer lors de la création de votre tâche.et de les transmettre à votre
onClick()
getText()
semble fonctionner, mais d'autres méthodes, commeTextureView
'sgetBitmap()
, crash.Je pense que
getText
peut être l'accès dans le travail du fil, il est seulement l'ide de l'indice, et non pas l'exception d'exécutionOriginalL'auteur codeMagic
L'exception est levée, car
doInBackground()
est appelé à partir d'un thread d'arrière-plan. Je voudrais ajouter deux paramètres de Chaîne pour le constructeur de votreLogin
classe.Je voudrais vous conseiller pour acquérir plus de connaissances sur
AsyncTasks
et le Filetage sur Android. Par exemple, il y a une page dans le programme officiel docs: http://developer.android.com/guide/components/processes-and-threads.html.Vous pouvez également jeter un oeil à ce cours: https://www.udacity.com/course/developing-android-apps--ud853. Vous pouvez apprendre beaucoup de notions de base de l'Android cadre.
OriginalL'auteur Leon Joosse