AsyncTask异步任务(例:时间显示)
**异步任务参考教程(概念理解):https://www.runoob.com/w3cnote/android-tutorial-ansynctask.html
1.布局一个TextView显示时间activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
>
<TextView
android:id="@+id/time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textSize="24sp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="开始"
/>
</RelativeLayout>
2.MainActivity.java
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity implements OnClickListener{
private TextView tv;
private Button btn;
//private AtomicBoolean started=new AtomicBoolean();
private MyAnsycTask mat;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.time);
btn=(Button) findViewById(R.id.button);
btn.setOnClickListener(this);
}
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onClick(View v) {
mat=new MyAnsycTask(tv,btn);
mat.execute(100);
}
}
3.MyAsyncTask.java
package guun.example.asynctask;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import android.os.AsyncTask;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MyAnsycTask extends AsyncTask<Integer, Integer,String>{
private TextView tv1;
private Button btn1;
private Date date;
private SimpleDateFormat sdf;
public MyAnsycTask(TextView tv1,Button btn1) {
this.btn1=btn1;
this.tv1=tv1;
}
@Override
protected String doInBackground(Integer... params) {
for(int i=0;;i++) { //时间无休止
try {
Thread.sleep(100); //线程休眠!!!!不能少
}catch(InterruptedException e) {
e.printStackTrace();
}
publishProgress(i);
}
}
protected void onPreExecute() {
tv1.setVisibility(View.VISIBLE);
tv1.setTextSize(18);
btn1.setEnabled(false);
}
protected void onProgressUpdate(Integer...values) {
date=new Date();
sdf=new SimpleDateFormat("yyyy-mm-dd hh:mm:ss",Locale.CHINA);
date.setTime(System.currentTimeMillis());
String ds = sdf.format(date);
tv1.setText(ds);
}
}
效果图:
该task只能被执行一次,生命周期只有一次,否则多次调用时会出现异常,如图
如果需要重新显示动态刷新效果,需要关闭android模拟器,然后重新开启,退出应用再次执行没有用。