(一)Handler另起线程实现异步操作
注:使用handler加入到消息队列的线程其实是跟main同一个线程,而不是两个线程,因为调用的是run方法,而不是start方法
activity_main.xml
(二)用handler更新progressBar
MainActivity.java
(三)使用handler绑定新线程并用Bundle传递数据
注:绑定新线程必须与getLooper()方法连用
MainActivity.java
注:使用handler加入到消息队列的线程其实是跟main同一个线程,而不是两个线程,因为调用的是run方法,而不是start方法
MainActivity.java
package com.example.androidrunnable;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
Button startButton;
Button endButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button) findViewById(R.id.startButton);
endButton = (Button) findViewById(R.id.endButton);
startButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.post(updateThread);
}
});
endButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
handler.removeCallbacks(updateThread);
}
});
}
Handler handler = new Handler();
Runnable updateThread = new Runnable() {
@Override
public void run() {
System.out.println("UpdateThread");
handler.postDelayed(updateThread, 3000);
}
};
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/startButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start"/>
<Button
android:id="@+id/endButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="end"/>
</LinearLayout>
(二)用handler更新progressBar
MainActivity.java
package com.example.handlerprogress;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
Button startButton;
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startButton = (Button) findViewById(R.id.startButton);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
startButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
progressBar.setVisibility(View.VISIBLE);
updateProgressBarHandler.post(updateThread);
}
});
}
Handler updateProgressBarHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
progressBar.setProgress(msg.arg1);
updateProgressBarHandler.post(updateThread);
if(msg.arg1==100){
updateProgressBarHandler.removeCallbacks(updateThread);
}
}
};
Runnable updateThread = new Runnable() {
int i = 0;
@Override
public void run() {
System.out.println("Begin Thread");
i = i + 10;
Message message = updateProgressBarHandler.obtainMessage();
message.arg1 = i;
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
updateProgressBarHandler.sendMessage(message);
}
};
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressBar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:visibility="gone"
/>
<Button
android:id="@+id/startButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="start"/>
</LinearLayout>
(三)使用handler绑定新线程并用Bundle传递数据
注:绑定新线程必须与getLooper()方法连用
MainActivity.java
package com.example.handlerbundle;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
HandlerThread handlerThread = new HandlerThread("handler_thread");
handlerThread.start();
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
Message msg = myHandler.obtainMessage();
Bundle b = new Bundle();
b.putInt("age", 20);
b.putString("name", "John");
msg.setData(b);
msg.sendToTarget();
}
class MyHandler extends Handler{
public MyHandler() {
}
public MyHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
System.out.println("age is " + age + ",name is"+name);
System.out.println("handlermessage...");
}
}
}