异步任务 AsyncTask 进度条的更新
2015-10-11 11:12
232 查看
进度条的更新问题
创建工程 activity_main.xml 布局文件代码<?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" android:orientation="vertical" > <Button android:id="@+id/but1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="progressbar" /> </LinearLayout>MainActivity.java 代码
import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener { private Button but1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); but1 = (Button) findViewById(R.id.but1); but1.setOnClickListener(this) ; } @Override 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 arg0) { switch (arg0.getId()) { case R.id.but1: startActivity(new Intent(MainActivity.this, progressbar.class)); break; } } }显示进度条的页面布局文件 progressbar.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:padding="16dip" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <ProgressBar android:id="@+id/pg" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginBottom="206dp" /> </RelativeLayout>显示进度条的Java代码 progressbar.java
import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.widget.ProgressBar; public class progressbar extends Activity { private ProgressBar pg; myProgressbar task; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.progressbar); pg = (ProgressBar) findViewById(R.id.pg); task = new myProgressbar(); task.execute(); } class myProgressbar extends AsyncTask<Void, Integer, Void> { //模拟进度的更新 @Override protected Void doInBackground(Void... arg0) { for (int i = 0; i < 100; i++) { if (isCancelled()) { break; } publishProgress(i); try { Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return null; } @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); if (isCancelled()) { return; } pg.setProgress(values[0]); } } }需要在AndroidManifest.xml 注册<activity android:name="com.example.httpurl1.progressbar" ></activity>启动模拟器 可以看到有进度条的显示 可以正常的进行但是 当进度条没进行完的时候退出该页面 然后在进入这个页面 我们会发现 进度条并不会立即开始显示 而是等一会才开始显示为什么??因为 我们采用一个for循环来模拟进度更新 所以只有这个for循环结束的时候才会进行下一个task 当离开这个页面的时候 for循环没结束的话,当我们再次进入的时候就要等到它结束才能开始更新。
解决方法 是让 这个task的生命周期和activity的生命周期保持一致。
在显示进度条的Java代码 progressbar.java 代码中添加代码@Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) { task.cancel(true); //在暂停的时候进行判断 如果task部位null且在运行的时候就把 task
取消掉 } }再运行 发现和上次的效果一样。
为什么??
因为我们虽然对对task进行cancel但是并不是真正的把它结束掉。而是向task发送一个cancel的请求 把该task标记为cancel状态,并不是真正的取消线程的操作在显示进度条的Java代码 progressbar.java 的doInBackground 方法的for循环中添加一个判断
if (isCancelled()) { break;} 如果线程取消状态则跳出循环
在 onProgressUpdate 方法中加一个判断 <pre name="code" class="java" style="font-size: 12.6315793991089px;">if (isCancelled()) { return;}
<strong>则<span style="font-size: 12.6315793991089px;">显示进度条的Java代码 </span><span style="font-size: 12.6315793991089px;">progressbar.java 完整的代码是</span></strong>
<span style="font-size: 12.6315793991089px;"></span><pre name="code" class="java">import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.widget.ProgressBar;public class progressbar extends Activity {private ProgressBar pg;myProgressbar task;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.progressbar);pg = (ProgressBar) findViewById(R.id.pg);task = new myProgressbar();task.execute();}@Overrideprotected void onPause() {// TODO Auto-generated method stubsuper.onPause();if (task != null && task.getStatus() == AsyncTask.Status.RUNNING) {task.cancel(true);}}class myProgressbar extends AsyncTask<Void, Integer, Void> {@Overrideprotected Void doInBackground(Void... arg0) {for (int i = 0; i < 100; i++) {if (isCancelled()) {break;}publishProgress(i);try {Thread.sleep(300);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return null;}@Overrideprotected void onProgressUpdate(Integer... values) {// TODO Auto-generated method stubsuper.onProgressUpdate(values);if (isCancelled()) {return;}pg.setProgress(values[0]);}}}
相关文章推荐
- ajax使用
- JavaScript设计模式--单例模式
- WCSP 2015 南京 空间信息网络相关论文
- 图解Linux命令之--chown命令
- VS2010 测试 -普通单元测试 http://www.cnblogs.com/rhythmK/archive/2012/04/20/2458832.html
- 策略模式
- 九、机器学习系统设计笔记之分类III:音乐体裁分类
- jstl标签的使用
- Android ViewPager多页面滑动切换以及动画效果
- word转化html
- 2015年6月数据库流行度排行榜
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- 一道组合数取模题
- json使用
- Android高仿微信照片选择器+预览+显示照片
- git bash here 右键菜单失效后的修复方法
- X86在逻辑地址、线性地址、理解虚拟地址和物理地址
- jsp的el表达式使用
- mybatis04 根据用户名称模糊查询用户信息
- CentOS7上安装MySQL Workbench