Updating Android UI using threads
Solution 1:
You cannot change UI elements from a non-UI thread. Try using runOnUiThread.
runOnUiThread(new Runnable(){
@Override
public void run(){
// change UI elements here
}
});
Solution 2:
You cannot touch anything in the UI thread from a background thread, to do that use Handlers
, initialize your background thread
passing it a Handler
object. When data arrives to use the handler
to send a message to the UI. In the UI when the message from the background thread
comes, just update the Views
.
Example Code Snippet :
in the background thread:
if(dataArrives){
Message msg = handler.obtainMessage();
msg.what = UPDATE_IMAGE;
msg.obj = bitmap;
msg.arg1 = index;
handler.sendMessage(msg);
}
in the UI thread:
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==UPDATE_IMAGE){
images.get(msg.arg1).setImageBitmap((Bitmap) msg.obj);
}
super.handleMessage(msg);
}
};
and pass the handler
to the background thread
.
Solution 3:
Or just use AsyncTask, it is more useful IMHO.