我正在尝试实现一个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

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