Donc, j'obtiens une erreur que je mets à jour l'interface utilisateur du mauvais thread. Ce n'était bien sûr pas mon intention. Mon cas est assez long, mais je vais essayer de le rendre justice avec des extraits de code. Mon but final est d'exécuter une tâche coûteuse dans un thread séparé et de poster une mise à jour qui se produit en cours de route et à la fin de ma liste.Comment faire pour mettre à jour l'interface utilisateur via Handler
public class test extends Activity {
private ArrayAdapter<String> _mOutArrayAdapter;
private ListView _mOutView;
private EditText _mCmdEditText;
private Button _mRunButton;
private Interpreter _interpreter;
// Need handler for callbacks to the UI thread
public final Handler _mHandler = new Handler() {
public void handleMessage(Message msg) {
_mOutArrayAdapter.add(msg.getData().getString("text"));
};
};
// Create runnable for posting
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateResultsInUi();
}
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
_interpreter = new Interpreter(true);
_mOutView = (ListView)findViewById(R.id.out);
_mCmdEditText = (EditText)findViewById(R.id.edit_command);
_mRunButton = (Button)findViewById(R.id.button_run);
_mOutArrayAdapter = new ArrayAdapter<String>(this, R.layout.message);
_mOutView.setAdapter(_mOutArrayAdapter);
_mOutArrayAdapter.clear();
_interpreter.setOutputAdapter(_mOutArrayAdapter);
Thread t = new Thread() {
public void run() {
_mResults = _interpreter.executeExpression("startup;",_mHandler);
_mHandler.post(mUpdateResults);
}
};
t.start();
);
Et puis à l'intérieur inpterpreter Je fais ceci:
public class Interpreter
{
private static Handler _mHandler;
public String executeExpression(String expression, Handler handler)
{
_mHandler = handler;
//Do a bunch of stuff that sometimes calls displayText from this class or from others
return answer;
}
public void displayText(String text)
{
Message msg = new Message();
Bundle bndl = new Bundle();
bndl.putString("text", text);
msg.setData(bndl);
_mHandler.dispatchMessage(msg);
}
}
L'affichage des œuvres de réponse finale. Et le dispatchMessage finit par déclencher handleMessage, mais il jette une erreur que je ne peux pas modifier l'interface utilisateur en dehors du thread d'interface utilisateur que je sais est illégal. Alors, qu'est-ce que je fais de mal?
Merci!
Essayez d'utiliser Async Tâche et comme d'autres ont dit, pas sûr de ce que fait votre code – jonney
Vous avez raison, sendMessage est utilisé pour envoyer des messages qui sont reçus dans handleMessage de gestionnaire. –