Java 具有可运行界面的Android progressbar
我有如下代码: main.xmlJava 具有可运行界面的Android progressbar,java,android,multithreading,Java,Android,Multithreading,我有如下代码: main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
BasicViews2Activity.java
public class BasicViews2Activity extends Activity
{
static int progress;
ProgressBar progressBar;
int progressStatus = 0;
Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progress = 0;
progressBar = (ProgressBar) findViewById(R.id.progressbar);
//---do some work in background thread--
new Thread(new Runnable()
{
public void run()
{
//---do some work here--
while (progressStatus < 10)
{
progressStatus = doSomeWork();
}
//---hides the progress bar---
handler.post(new Runnable()
{
public void run()
{
progressBar.setVisibility(View.GONE);
}
});
}
//---do some long running work here--
private int doSomeWork()
{
try {
Thread.sleep(500);
} catch (InterruptedException e)
{
e.printStackTrace();
}
return ++progress;
}
}).start();
}
}
公共类基本视图2活动扩展活动
{
静态进程;
ProgressBar ProgressBar;
int progressStatus=0;
Handler=newhandler();
/**首次创建活动时调用。*/
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
进度=0;
progressBar=(progressBar)findViewById(R.id.progressBar);
//---在后台线程中执行一些工作--
新线程(newrunnable())
{
公开募捐
{
//---在这里做些工作--
而(进展状态<10)
{
progressStatus=doSomeWork();
}
//---隐藏进度条---
handler.post(新的Runnable()
{
公开募捐
{
progressBar.setVisibility(View.GONE);
}
});
}
//---在这里做一些长期的工作--
私人内部文件系统()
{
试试{
睡眠(500);
}捕捉(中断异常e)
{
e、 printStackTrace();
}
返回++进度;
}
}).start();
}
}
为什么我们在thread类中使用两个可运行对象来取消progressbar?难道我们不能在第一个可运行的obj中完成它吗?就在while循环之后,没有另一个对象?asyncTask类可以很容易地与progressbars一起使用。因为他们有一个onPreexecute和onPostexecute,我们可以使用它从后台活动更新ui线程
public static final int DIALOG_DOWNLOAD_PROGRESS = 0;
private ProgressDialog mProgressDialog;
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_DOWNLOAD_PROGRESS:
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("waiting 5 minutes..");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setCancelable(false);
mProgressDialog.show();
return mProgressDialog;
default:
return null;
}
}
然后编写一个异步任务来更新进度
private class DownloadZipFileTask extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... urls) {
//Copy you logic to calculate progress and call
publishProgress("" + progress);
}
protected void onProgressUpdate(String... progress) {
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@Override
protected void onPostExecute(String result) {
dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
}
}
私有类下载ZipFileTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
showDialog(对话框下载进度);
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
//复制您的逻辑以计算进度并调用
出版进度(“+”进度);
}
受保护的void onProgressUpdate(字符串…进度){
mProgressDialog.setProgress(Integer.parseInt(progress[0]));
}
@凌驾
受保护的void onPostExecute(字符串结果){
dismissDialog(对话框下载进度);
}
}
希望这能让你的代码变得更简单…@shaon007很抱歉发得太晚,是的,你可以用一个
可运行的类来完成
如下
按照创建xml的方式创建xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressbar"
android:visibility="invisible"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
你的工作完成了吗
public class MainActivity extends AppCompatActivity {
Handler handler;
private ProgressBar progressBar;
private int checkCount = 5000; // counter for progressbar visibility
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
handler = new Handler(); // handler object
// runnable class
final Runnable runnable = new Runnable() {
@Override
public void run() {
progressBar.setVisibility(View.VISIBLE);
checkCount -= 1000;
if(checkCount > 0) {
handler.postDelayed(this,1000);
}
else {
progressBar.setVisibility(View.INVISIBLE);
Toast.makeText(MainActivity.this,"Progress bar invisible",Toast.LENGTH_SHORT).show();
// Or your other work
}
}
};
handler.postDelayed(runnable,1000); // will start run() method after 1 second
}
}