因此,我收到一個錯誤,我正在從錯誤的線程更新UI。這當然不是我的意圖。我的情況很長,但我會盡量用代碼片斷來做到這一點。我的最終目標是在單獨的線程中運行昂貴的任務,並在發佈過程中發佈更新,最後發佈到我的listView。如何通過處理程序更新UI
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();
);
然後裏面inpterpreter我這樣做:
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);
}
}
最終答案作品的展示。 dispatchMessage最終觸發了handleMessage,但它拋出了一個錯誤,我無法從UI線程之外修改UI,我知道這是非法的。那麼,我做錯了什麼?
謝謝!
嘗試使用異步任務和其他人說,不知道你的代碼是做 – jonney 2010-11-09 17:17:44
你說得對,使用SendMessage發送在處理程序的的handleMessage接收的消息。 – 2010-11-09 18:45:21