我正在尝试实现一个ProgressBar,以便当我的应用程序变得稍微空闲时(从尝试计算有很多事情正在进行的方法),它应该显示该方法的完成进度,这是一个布尔方法,应在以下位置返回true结束因此,现在我很困惑如何在不是Integer返回类型的方法时监视进度(作为整数值)

我尝试了很多不同的事情,但是当我使用处理程序时,我不知道如何将其编码为:

..当带有进度栏处理程序的线程完成时,method = true,显示数据

我将展示自己在做什么,即使我的逻辑目前可能进展不顺利

private ProgressDialog progressBar;
private int percentageStatus = 0;
private Handler progressBarHandler = new Handler();


    Thread loadingBar = new Thread(new Runnable() {

            public void run() {


                while(percentageStatus <= 100)
                {
                    percentageStatus++;

                    try 
                    {
                        Thread.sleep(20);
                    } 
                    catch (InterruptedException e) 
                    {
                        e.printStackTrace();
                    }


                    progressBarHandler.post(new Runnable() {

                        public void run() 
                        {
                            progressBar.setProgress(percentageStatus);

                            Log.i("TESTS", "check..." + percentageStatus);
                        }
                    });
                }

                if (percentageStatus >= 100) 
                {


                    try 
                    {
                        Thread.sleep(100);
                    } 
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    // close the progress bar dialog
                    //progressBar.dismiss();

                    progressBar.cancel();
                }
            }
        });



        @Override
        public void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);

            progressBar = new ProgressDialog(this);
            progressBar.setCancelable(true);
            progressBar.setMessage("Loading...");
            progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressBar.setProgress(0);
            progressBar.setMax(100);
            progressBar.show();

            loadingBar.start();


            while(doWaitTask() < 100)
            {
                doWaitTask();
            }

            programCreated = true;

            if(programCreated == true)      
            {   
                data = (TextView)findViewById(R.id.debug);      
                MyAsyncTask task = new  MyAsyncTask();
                task.execute(); //this is an async task which just appends some text to a TextView
            }

        }



public int doWaitTask() {

        while (loadingValue <= 10000) {

            loadingValue++;
        }

        return 100;
    }

“ doWaitTask()”只是我用来模拟正在完成的某些工作的方法(出于SSSCCEE的目的)

总结一下:在progressBar显示和更新进度时,我试图使屏幕为空,没有文本,一旦进度完成,进度完成后,它应该在屏幕上显示一些内容(因此,我试图让它像加载栏一样起作用)

使用异步任务会更好吗? 在这种情况下又如何?

===============>>#1 票数:0

我要求您使用AsyncTask。 您可以在下面找到我们如何使用它的示例:

  1. 首先,我们需要创建活动的界面(在我的示例中,我们将使用Button和ProgressBar):

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/myLayout" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/btDoTask" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginLeft="102dp" android:layout_marginTop="24dp" android:text="Do Async Task" /> <ProgressBar android:id="@+id/pbAsyncBackgroundTraitement" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/button1" android:layout_marginTop="20dp" /> </RelativeLayout> 
  2. 其次,我们将实现我们的自定义AsyncTask:

     package com.exemple.devhacksecuretest.asynctaskwithprogressbar; import com.example.devhacksecuretest.R; import android.app.Activity; import android.os.AsyncTask; import android.util.Log; import android.view.View; import android.widget.ProgressBar; import android.widget.Toast; public class CustomAsyncTask extends AsyncTask<String, Integer, Integer>{ private Activity mContext; private ProgressBar pbAsyncBackgroundTraitement; public CustomAsyncTask(Activity mContext) { super(); this.mContext = mContext; } /* function which is called first */ @Override protected void onPreExecute() { this.pbAsyncBackgroundTraitement = (ProgressBar) mContext.findViewById(R.id.pbAsyncBackgroundTraitement); this.pbAsyncBackgroundTraitement.setVisibility(View.VISIBLE); super.onPreExecute(); } /* function work on background */ @Override protected Integer doInBackground(String... params) { // Here you have to put what you want to do for (int i = 0; i< params[0].length(); i++){ try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } int progress = (i * 100 / params[0].length()); Log.i("test", " progress : " + progress); // call onProgressUpdate() publishProgress(progress); } return null; } /* function to update the ProgressBar */ @Override protected void onProgressUpdate(Integer... values) { // update the progress bar this.pbAsyncBackgroundTraitement.setProgress(values[0]); super.onProgressUpdate(values); } /* function called after work on background function is over */ @Override protected void onPostExecute(Integer result) { // The work is done, you can do an action like create an activity or set invisible some UI components this.pbAsyncBackgroundTraitement.setVisibility(View.GONE); Toast.makeText(this.mContext, "Work is over... Do what you want now...bla bla bla", Toast.LENGTH_LONG).show(); super.onPostExecute(result); } } 

    3,最后,在包含Button和ProgressBar的主活动中,只需在OnClick按钮中添加以下几行:

      public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()){ case R.id.btDoTask: // Call CustomAsyncTask CustomAsyncTask myCustomTask = new CustomAsyncTask(this); // Execute task, we give it the parameter to work with myCustomTask.execute("Params to execute in background"); break; } } 

===============>>#2 票数:0

您不应该人为地弥补已经取得的进步。 编排进度可能太慢(这将导致任务似乎过早完成),或者太快(将使进度条长时间显示100%)。

如果您知道实际的进度,则应使用该进度。 如果处理需要N步(大约相同的长度),并且您已完成x步,则您的百分比为100 * x / N。 使用AsyncTask包含逻辑是使UI线程保持响应能力的一种好方法。

另一方面,如果您不知道已经取得了多少进展,则应使用“不确定模式” ProgressBar。 引用ProgressBar JavaDoc

在不确定模式下,进度条显示循环动画,而没有进度指示。 当任务的长度未知时,应用程序将使用此模式。 不确定进度条可以是纺车或单杠。

===============>>#3 票数:0 已采纳

我已经针对我想要的进行了变通,这是一种非常“确定性的”方法

首先,我有一个登录课程

公共类Login扩展Activity实现OnClickListener

static String port_text;
static String ip_text;
static int portnum;

public void onClick(View v) {

    if(v.getId() == btn1.getId())
    {
        port_text = port.getText().toString();
        ip_text = ip.getText().toString();

        portnum = Integer.parseInt(port_text);  


        /**.....exception handling operations...... 

        **/

            Intent myIntent = new Intent(Login.this, Loader.class);

            startActivity(myIntent);        

    }
}

我打算去一个加载屏幕,该屏幕专用于等待所需的类加载

公共类加载器扩展Login

private ProgressDialog progressBar;

    static LoadingScreen instance;


    static LoadingScreen getInstance()
    {
        return instance;
    }


    public int getPort()
    {
        return portnum;
    }

    public String getIP()
    {
        return ip_text;
    }


    @Override
    public void onCreate(Bundle savedInstanceState){

        super.onCreate(savedInstanceState); 
        setContentView(R.layout.blank_activity);

        instance = this;

        progressBar = new ProgressDialog(this);
        progressBar.setCancelable(true);
        progressBar.setMessage("Loading...");
        progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        progressBar.setIndeterminate(true);
        progressBar.show();


        final Intent mainIntent = new Intent(LoadingScreen.this, MainActivity.class); 

        new Handler().postDelayed(new Runnable(){ 

            @Override 
            public void run() { 

                try 
                {
                    Thread.sleep(1000);
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }

                startActivity(mainIntent);              
                finish(); 

                progressBar.cancel();
            } 
        }, 2000);
    }

我必须使一个Singleton才能从“ Login”超类中获取静态变量数据,原因是,如果我在Handler中启动了一个意图捆绑包,则将无法在所需的类中检索该数据,因此情况下,我使用的是后延迟处理程序,该处理程序启动一个Intent并在处理程序结束之前等待指定的时间量(此时间值可以通过反复试验得出),因此这种方式可以避免在活动尝试进行操作时出现黑屏加载

公共类MainActivity扩展FragmentActivity

    Loader ls = Loader.getInstance();

    int port_num = ls.getPort();
    String ip_address = ls.getIP();

/*  ....do operations with the port num and IP address...*/

  ask by Conormcn translate from so

未解决问题?本站智能推荐:

2回复

显示ProgressBar上的当前进度

我显示以下ProgressBar : 看起来像这样 , 但我希望在条形图上显示当前的进度,如: 42/100 。 怎么能实现呢?
1回复

进度条未显示在片段中

我创建了一个Firebase应用程序。 到目前为止,一切都很好。 但是,我有一个无法解决的问题。 我的MainActivity.java正在实现Interface ProgressDisplay.java Interface有两种方法: 我无法从子片段中调用这2个方法
2回复

使用over gridview时,Progressbar显示错误的进度

ProgressBar状态显示有问题。 我有不同的图像gridview我要显示进度条状态(不同图像的不同进度状态)。我只是设置在这里如果imagePosition为零然后状态应该是50,在第二个图像上我要显示90和第三个想要显示10的图像(最大值为100)。 所以问题是它在第一和第三张图
1回复

ProgressBar(s)(水平)未显示(int)长的进度

我在市场上有一个应用程序,正在添加一些水平的ProgressBar。 第一个栏会更新并正确显示,没有任何问题。 第二个栏(相同的代码)在那里,但是尽管设置了最大值和进度,但没有显示进度。 我试图使视图无效(和postInvalidate()),但是没有运气。 这是一些片段: Lay
1回复

更改ProgressBar的进度

我正在创建一个应用程序,用户可以在其中输入特定的字节值,并且使用工作管理器为他们模拟上传进度。 因此,基本上是这样的: 该代码在工作管理器中。 UploadFile.java是我的活动。 虽然UploadFile.setUploadProgress(int progress)是
2回复

仅在方法完成时显示进度条

我想使用进度条显示导入数据的进度。 因此,当我按下按钮时,我调用该方法开始导入,并希望通过进度条显示进度。 但由于某种原因,当方法完成时显示条形并显示100%。 当我刷新页面进度条不会消失。 这是我的JSP: 在我的Bean中,我有一个方法,当我按下按钮时调用该方法,然后我设
2回复

ProgressBar不会在启动画面上逐渐显示进度

我有一个持续5秒钟的闪屏,我想使用ProgressBar来表示ProgressBar 。
4回复

显示进度对话框,直到任务完成工作

好吧,我有一个程序需要等到android完全启用wifi适配器。 我有这个活动代码,它可以工作,但是老实说,我不认为这是等待某些任务完成的正确方法(在这种情况下,android需要启用wifi)。 有人可以告诉我,等待程序执行直到完成某些任务的正确方法是什么? 所以程序场景:
1回复

进度条显示在recyclerview中的错误位置

单击任何项​​目时都有Recyclerview,应该显示该项目的进度条,但是当我单击某个项目时,进度条显示在错误的位置 这是我的xml: 这是我的课:
1回复

在执行Shell命令时显示进度条

我试图使进度条出现在我复制文件的过程中(使用shell命令)。 这是我的代码: 我需要执行多个不同的过程,因此,如何使进度对话框显示在开始位置,并在最后一个文件成功完成复制后将其关闭。 我尝试在procccess1之前显示该对话框,并在最后一个过程后关闭,但这不起作用。 谢谢。