在Android中不支持在多线程中操作UI,所Adroid提供了三种异步任务机制,runOnUiThread,Handler和AsyncTask。
下面 是一个完整例子:
public class MainActivity extends Activity {
protected static final int thread_quest = 0;
ImageButton btn;
ImageView iv ;
ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView)findViewById(R.id.image1);
iv.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.bluetooth));
pb = (ProgressBar)findViewById(R.id.progressBar1);
this.initbtn();
}
private Handler handle = new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what == thread_quest)
{
iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icone_windows));
//iv.setImageBitmap(BitmapFactory.decodeFile("e:\\Sun.png"));
}
super.handleMessage(msg);
}
};
private Thread th = new Thread(new Runnable(){
@Override
public void run() {
//iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.wm));//错误操作
}
});
private void initbtn()
{
findViewById(R.id.button2).setOnClickListener(new OnClickListener(){//使用AsyncTask处理异步UI操作
@Override
public void onClick(View v) {
Progress pg = new Progress();
pg.execute();
}
});
findViewById(R.id.button1).setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
new Thread(new Runnable(){
@Override
public void run() {
runOnUiThread(new Runnable(){
@Override
public void run() {
iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.sun));}
});
}
}).start();
}
});
if(btn==null)
{
btn = (ImageButton)findViewById(R.id.imageButton1);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
new Thread(new Runnable(){
@Override
public void run() {
Message msg = new Message();
msg.what = MainActivity.thread_quest;
handle.sendMessage(msg);
//iv.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icone_windows));
}
}).start();
}
});
}
}
//定义一个内部类
public class Progress extends AsyncTask<Void, Integer, Boolean> {
private int progress=10;
@Override
protected Boolean doInBackground(Void... params) {
while(progress<100)
{
progress = (progress+2)%100;
try {
Thread.sleep(50);
this.publishProgress(progress);
} catch (InterruptedException e) {
e.printStackTrace();}
}
return null;
}
@Override
protected void onPreExecute() {
pb.setProgress(progress);
super.onPreExecute();
}
@Override
protected void onPostExecute(Boolean result) {
Toast.makeText(MainActivity.this, "AsyncTask执行完毕", Toast.LENGTH_SHORT);
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(Integer... values) {
pb.setProgress(progress);
super.onProgressUpdate(values);
}
}
}