Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有可运行界面的Android progressbar_Java_Android_Multithreading - Fatal编程技术网

Java 具有可运行界面的Android progressbar

Java 具有可运行界面的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

我有如下代码:

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: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
    }
}