1.实现自己的Handler,对消息进行处理
2.在新的线程中发送消息
源码 main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:gravity="center"
android:id="@+id/txtView" />
<ProgressBar
android:id="@+id/downloadbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="20px" />
</LinearLayout>
处理信息源码
package demo.bit.testthread;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ProgressBar;
import android.widget.TextView;
public class TestThread extends Activity {
/** Called when the activity is first created. */
private TextView txtView;
private ProgressBar downLoadBar;
MyHandler myHandler;
private MyThread myThread;
private boolean isExit = true;
private boolean isQuit = false;
int count = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i("TestThread", Thread.currentThread().getName());
txtView = (TextView) findViewById(R.id.txtView);
downLoadBar = (ProgressBar) findViewById(R.id.downloadbar);
myHandler = new MyHandler();
}
private class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
downLoadBar.setProgress(msg.arg1);
txtView.setText(String.valueOf(msg.arg1));
super.handleMessage(msg);
}
}
private class MyThread extends Thread{
@Override
public void run() {
int i = 0 ;
isExit = false;
downLoadBar.setMax(100);
Message msg = null;
while (i++ < 100 )
{
msg = myHandler.obtainMessage();
msg.arg1 = i;
Log.i("FF", msg.getTarget().toString());
msg.sendToTarget();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("MyThread", ""+i);
if(isQuit) break;
}
isExit = true;
super.run();
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
isQuit = true;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
myThread.interrupt();
myThread.stop();
super.onDestroy();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
if(isExit){
myThread = new MyThread();
myThread.start();
}
}
return super.onTouchEvent(event);
}
}
注:
1.Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道) 。
2.Handler: 你可以构造Handler 对象来与Looper 沟通,以便push 新消息到Message Queue 里;或者接收Looper( 从Message Queue 取出) 所送来的消息。每个handler对象与其创建的线程相关联,只能有一个相关联。
3. Message Queue( 消息队列): 用来存放线程放入的消息。
4.线程:UI thread 通常就是main thread ,而Android 启动程序时会替它建立一个Message Queue 。
5.启动进程运行时,如若推出应用了,为了系统的性能,一般要将所开启的线程杀死,java的线程销毁的处理过程一般是通过外部变量使得正在运行的线程退出run方法,再将它停止。
6.android应用程序的界面的更新只能在UI主线程中更新,子线程是不能操作UI的,只能进行数据、系统 等其他非UI的操作。