erreur: Seul le thread qui a créé un point de vue de la hiérarchie peut toucher son point de vue
Salut et merci de regarder ma question.
Je suis un intermédiaire programmeur en C, mais un Android newbie. J'ai essayé d'obtenir un chat de travail de la programmation. En supposant que tout le reste dans le code ci-dessous fonctionne parfaitement. La seule question que je voudrais poser, c'est quand j'essaie de setText() à partir d'un thread en cours d'exécution, j'obtiens une exception ci-dessus. J'ai regardé de nombreux de nombreux sites web et ici aussi. Trouvé beaucoup de choses, mais je ne comprends vraiment pas. Merci de m'expliquer le plus simplement possible ou me proposer des simple de fixer, si possible.
Merci beaucoup!!
public class chatter extends Activity {
private String name = "Unknown User";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final EditText msgToServer = (EditText) findViewById(R.id.msgBox);
final EditText chatFromServer = (EditText) findViewById(R.id.chatBox);
final Button MsgToServer = (Button) findViewById(R.id.sendButton);
Socket socket = null;
String ipAddress = "192.168.1.103";
try {
InetAddress serverAddr = InetAddress.getByName(ipAddress);
Socket socketMain = new Socket(serverAddr, 4444);
socket = socketMain;
} catch (IOException e) {
//TODO Auto-generated catch block
Log.e("TCP", "error", e);
}
final OutMsg outMsg = new OutMsg(socket);
Thread msgSenderThread = new Thread(outMsg);
msgSenderThread.start();
//chatFromServer.post(new InMsg(socket, chatFromServer));
Thread msgReceiverThread = new Thread(new InMsg(socket, chatFromServer));
msgReceiverThread.start();
MsgToServer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String msgToServerString;
msgToServerString = msgToServer.getText().toString();
outMsg.message = name + ": " + msgToServerString;
outMsg.readyToSend = true;
msgToServer.setText("");
}
});
}
public void updateResultsInUi (String msg)
{
final EditText chatFromServer = (EditText) findViewById(R.id.chatBox);
chatFromServer.setText(msg);
}
public class InMsg implements Runnable {
Socket socket;
EditText chatFromServer;
public InMsg(Socket socket, EditText chatFromServer)
{
this.socket = socket;
this.chatFromServer = chatFromServer;
}
public void run(){
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str = "FIRSTMESSAGEFROMSERVER";
while (true)
{
if (str.equals("FIRSTMESSAGEFROMSERVER"))
str = in.readLine();
else
str = str + "\n" + in.readLine();
Log.e("TCP", "got the message: " + str);
//Here is where went wrong******************
chatFromServer.setText(str);
//******************************************
}
} catch (IOException e) {
//TODO Auto-generated catch block
Log.e("TCP", "error in receiving", e);
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle item selection
switch (item.getItemId()) {
case R.id.setNameMenu:
setname();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void populateChatBox (String msgFromS)
{
Log.e("TCP", "going in to popC");
final EditText textNameInput = (EditText) findViewById(R.id.nameBox);
Log.e("TCP", " popC");
textNameInput.setText(msgFromS);
Log.e("TCP", "going out from popC");
}
public void setname()
{
setContentView(R.layout.custom_dialog);
final EditText textNameInput = (EditText) findViewById(R.id.nameBox);
Button submitNameButton = (Button) findViewById(R.id.submitNameButton);
submitNameButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String nameinput = textNameInput.getText().toString();
if (!name.equals(""))
name = nameinput;
setContentView(R.layout.main);
}
});
}
}
OriginalL'auteur Byte | 2011-02-23
Vous devez vous connecter pour publier un commentaire.
Dans votre méthode run ():
Créer le mHandler dans votre thread de l'INTERFACE utilisateur;
handleMessage ne semble pas être une super méthode de la classe de Gestionnaire; pourquoi avez-vous @Override? J'ai une erreur quand j'essaie ce.
OriginalL'auteur Veeresh
Vous n'êtes pas sur le thread de l'INTERFACE utilisateur lors de la mise en place du texte. Vous devez être sur l'INTERFACE utilisateur si vous souhaitez travailler sur les éléments de l'UI. Créer un gestionnaire de message sur le thread d'INTERFACE utilisateur, d'envoyer des messages et appeler setText à partir du gestionnaire sur le thread d'INTERFACE utilisateur.
OriginalL'auteur Veeresh
vous pouvez le faire chaque fois que vous êtes dans un thread:
OriginalL'auteur zrgiu
Votre problème, c'est qu'il y a certaines interactions que vous ne pouvez le faire sur le thread d'INTERFACE utilisateur. C'est l'un d'entre eux.
Semble que vous pourriez vouloir utiliser des AsyncTask
http://developer.android.com/reference/android/os/AsyncTask.html
Fondamentalement, vous pourriez faire votre Exécutable, une AsyncTask la place, et le setText dans onProgressUpdate, qui est exécuté sur l'UIThread.
OriginalL'auteur Mike dg
Si vous souhaitez utiliser une AsyncTask à s'exécuter en arrière-plan c'est comment j'allais le faire:
}
Pour exécuter le code:
OriginalL'auteur Jordan Hochstetler