【问题标题】:How to add progress bar until loop execution is finished?如何在循环执行完成之前添加进度条?
【发布时间】:2017-12-05 15:29:28
【问题描述】:

我正在开发一个 android 应用程序,我需要在其中显示一个 ProgressBar,直到循环执行完成。执行后会进入下一个Activity。

这是我的java代码

    public class Image_Recognition extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image__recognition);

        Button btnNextPage = (Button) findViewById(R.id.btnNextPage);


            btnNextPage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();

                        Frame frame = new Frame.Builder().setBitmap(bitmap).build();
                        SparseArray<TextBlock> items = textRecognizer.detect(frame);
                        StringBuilder stringBuilder = new StringBuilder();
                        for (int i = 0; i < items.size(); ++i) {
                            TextBlock item = items.valueAt(i);
                            stringBuilder.append(item.getValue());
                            stringBuilder.append("\n");
                        }
                        stringBuilder.append('.');
                        txtResult.setText(stringBuilder.toString());


                        str = stringBuilder.toString();
                        Intent myintent = new Intent(Image_Recognition.this, ReminderAddActivity.class);
                        myintent.putExtra("translate", str);
                        startActivity(myintent);

                }
            });
        }
    //}
}

【问题讨论】:

标签: android android-progressbar


【解决方案1】:

你可以试试这个。

final ProgressDialog dialog = new ProgressDialog(Image_Recognition.this);
btnNextPage.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {



                    dialog.show(Image_Recognition.this, "", "Please wait...", true);



                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {

                            TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();

                            if (!textRecognizer.isOperational())
                                Log.e("ERROR", "Detector dependencies are not yet available");
                            else {

                                Frame frame = new Frame.Builder().setBitmap(bitmap).build();
                                SparseArray<TextBlock> items = textRecognizer.detect(frame);
                                StringBuilder stringBuilder = new StringBuilder();
                                for (int i = 0; i < items.size(); ++i) {
                                    TextBlock item = items.valueAt(i);
                                    stringBuilder.append(item.getValue());
                                    stringBuilder.append("\n");
                                }
                                stringBuilder.append('.');
                                txtResult.setText(stringBuilder.toString());

                                str = stringBuilder.toString();
                            }

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    dialog.dismiss();
                                    dialog.setCancelable(true);
                                    Intent myintent = new Intent(Image_Recognition.this, ReminderAddActivity.class);
                                    myintent.putExtra("translate", str);
                                    startActivity(myintent);
                                }
                            });
                        }
                    },5000);

【讨论】:

    【解决方案2】:

    这里有两个问题。

    ProgressBar,您可以在 XML 中使用 ProgressDialogProgressBar 并显示它,同时隐藏 IU 的其余部分。

    阻止用户界面

    您正在直接从单击侦听器运行循环,这意味着您将阻塞您的 UI,即使您显示某种进度,它也会被阻塞直到您的循环结束,您需要启动一个线程并运行你的循环。

    这是一个不太干净的点击监听器实现版本

    final ProgressDialog dialog = new ProgressDialog(Image_Recognition.this);
            dialog.show();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    TextRecognizer textRecognizer = new TextRecognizer.Builder(getApplicationContext()).build();
    
                    Frame frame = new Frame.Builder().setBitmap(bitmap).build();
                    SparseArray<TextBlock> items = textRecognizer.detect(frame);
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i < items.size(); ++i) {
                        TextBlock item = items.valueAt(i);
                        stringBuilder.append(item.getValue());
                        stringBuilder.append("\n");
                    }
                    stringBuilder.append('.');
                    txtResult.setText(stringBuilder.toString());
    
                    str = stringBuilder.toString();
    
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            dialog.dismiss();
                            Intent myintent = new Intent(Image_Recognition.this, ReminderAddActivity.class);
                            myintent.putExtra("translate", str);
                            startActivity(myintent);
                        }
                    });
                }
            }).start();
    

    【讨论】:

      【解决方案3】:

      您可以使用异步任务并在 doInBackground() 中运行循环

      class MyTask extends AsyncTask<Void, Void, Void> {
          ProgressDialog pd;
          public MyTask(ProgressDialog pd){
              this.pd=pd;
          }
          @Override
          protected void onPreExecute () {
              super.onPreExecute();
              pd.setMessage("Uploading . . .");
              pd.show();
              pd.setCancelable(false);
          }
      
          @Override
          protected Void doInBackground (Void...voids){
              for(int i=0;i<10000000;i++){
                  System.out.print(i);
              }
              return null;//download file
          }
      
          @Override
          protected void onPostExecute (Void aVoid){
              super.onPostExecute(aVoid);
              pd.dismiss();
          }
      }
      

      并在活动中调用new MyTask(pd).execute();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 1970-01-01
        相关资源
        最近更新 更多