首页 > 试题广场 >

页面上现有 ProgressBar 控件 progressB

[问答题]

页面上现有 ProgressBar 控件 progressBar ,请用书写线程以 10 秒的的时间完成其进度 显示工作。


public class ProgressBarActivity extends Activity { private ProgressBar progressBar;  private MyTask myTask;   @Override  protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);   setContentView(R.layout.activity_progressbar);  progressBar = (ProgressBar) findViewById(R.id.progress);   myTask = new MyTask();  myTask.execute();   } /**  * 底层是使用线程池完成的,而且使用了线程安全。  */  class MyTask extends AsyncTask<Void,Integer,Void>{ int max = progressBar.getMax();  int one = max/10;  @Override  protected Void doInBackground(Void... voids) { for (int i = 0;i<10;i++){ if (isCancelled()){ /** 如果取消了 直接使用break跳出循环 */  break;  }
                publishProgress(one);  try {
                    Thread.sleep(1000);  } catch (InterruptedException e) {
                    e.printStackTrace();  }
            } return null;  } @Override  protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values);  if (isCancelled()){ /** 如果取消了 直接使用return返回 */  return;  } /** 记录当前progressbar的进度值 */  int current = progressBar.getProgress();  progressBar.setProgress(current+values[0]);  }
    } @Override  protected void onPause() { super.onPause();  /** AsyncTask 的生命周期与Activity进行绑定 */  if (myTask != null && myTask.getStatus() == AsyncTask.Status.RUNNING){ /** 此时只是将对应的 AsyncTask 标记为取消状态 */  myTask.cancel(true);  }
    } @Override  protected void onDestroy() { super.onDestroy();  progressBar.setProgress(0);  }
}
编辑于 2017-06-09 15:27:35 回复(0)

相关代码解释请看代码

布局代码

<?xml version="1.0" encoding="utf-8"?>
<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"
   >

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/pg"
        style="@android:style/Widget.ProgressBar.Horizontal"/>
</RelativeLayout>

Activity代码

public class MainActivity extends AppCompatActivity {

    private ProgressBar progressBar;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progressBar = (ProgressBar) findViewById(R.id.pg);
        ProgressBarThread();
    }


    private void ProgressBarThread() {
        //开启一个线程
        Thread td = new Thread(new Runnable() {
            @Override
            public void run() {
                //得到progressBar的MAX长度
                int pdMax = progressBar.getMax();
                try {
                    //progressBar没达到最大长度时,进行循环
                    while (pdMax != progressBar.getProgress()) {
                        //得到一个每次进行的进度值,因为是要10s完成,所以分为10份
                        int stepPd = pdMax / 10;
                        //记录当前进度值
                        int currentPd = progressBar.getProgress();
                        //让progressBar进度每次前进最大值的十分之一
                        progressBar.setProgress(currentPd+stepPd);
                        //前进一次,睡眠一秒
                        Thread.sleep(1000);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        td.start();
    }
}
发表于 2017-02-19 19:48:30 回复(3)