概述:
不能在非UI线程中操完成UI线程中的操作;
服务必须在manifests中注册。
代码
进程
完成一个倒计时
public class TestThread extends Activity {
private Button mTimeCountButton;
private int count;
private static final int TIME_DESC = 0x23;
private Handler mHandler;
private Message message;
//方法2:在Handler中完成
// private Handler handler = new Handler() {
// @Override
// public void handleMessage(Message msg) {
// switch (msg.what){
// case TIME_DESC:
// mTimeCountButton.setText(count+"秒");
// count--;
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// handler.sendEmptyMessage(TIME_DESC);
// break;
// default:
// break;
// }
// }
// };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_test_thread);
message = new Message();
mTimeCountButton = (Button) findViewById(R.id.button_time_count);
mTimeCountButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyThread thread = new MyThread();
thread.start();
//方法1:在监听函数中
// count = 60;
// handler.sendEmptyMessage(TIME_DESC);
// new Thread(new Runnable() {
// @Override
// public void run() {
// while (count>0){
// Message msg = new Message();
// msg.obj = count+"秒";
// msg.what = TIME_DESC;
// handler.sendMessage(msg);
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// count--;
// }
// }
// }).start();
}
});
}
//方法3:用Looper完成
class MyThread extends Thread {
@Override
public void run() {
Looper.prepare();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d("dd", "接受到主线程的消息");
}
};
Looper.loop();
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="倒计时"/>
<Button
android:id="@+id/button_time_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="60秒"/>
</LinearLayout>
AsyncTask
新建的Task继承于AsyncTask需要实现三个方法:
public class TestAsycTask extends Activity {
private ProgressBar mProgressBar;
private Button mButton;
private int count;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_async_task);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar_asyc);
mButton = (Button) findViewById(R.id.button_asyc);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTask task = new MyTask();
task.execute();
}
});
}
class MyTask extends AsyncTask<String,String,String>{
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
int count = Integer.parseInt(values[0]);
mProgressBar.setProgress(count);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mButton.setText(s);
}
@Override
protected String doInBackground(String... params) {
while(count<101){
count++;
publishProgress(""+count);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "全部完成";
}
}
}
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:id="@+id/progressBar_asyc"
android:layout_gravity="center_horizontal"/>
<Button
android:id="@+id/button_asyc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start Download"/>
</LinearLayout>