문제

I have a task to run which takes a long time. So, I'd like to implement a progress dialog, spinning wheel, to show a message to users that the task is still running in the background. I found many solutions online and I used the following code. I ensured to run the task in separate thread. But it is not showing on UI.

OnClickListener confirmPrintButtonListener = new OnClickListener() {

    public void onClick(View v) {
        try {
            final SalesStockController salesStockController = new SalesStockController();
            final ArrayList<ProductReload> productReloadList = reloadActivityAdapter
                    .getReloadList();

            if (productReloadList.size() != 0) {                    
                progressDialog = new ProgressDialog(StockReloadActivity.this);
                progressDialog.setTitle("ABC Trading");
                progressDialog.setMessage("Wait while loading...");
                progressDialog.show();

                new Thread(new Runnable() {
                      public void run()
                      {
                        // do the thing that takes a long time
                          try {
                            salesStockController.reload(productReloadList);
                        } catch (SQLiteException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (FileNotFoundException e) { 
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (ABCException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } 

                          runOnUiThread(new Runnable() {
                          public void run()
                          {
                              progressDialog.dismiss();
                          }
                        });
                      }
                    }).start();

                AlertDialog.Builder builder = new AlertDialog.Builder(
                        v.getContext());
                builder.setCancelable(false).setPositiveButton("OK",
                        new DialogInterface.OnClickListener() {

                            public void onClick(DialogInterface dialog,
                                    int which) {
                                finish();
                            }
                        });

                AlertDialog alert = builder.create();

                alert.setTitle("ABC  Trading");
                alert.setMessage("Reload Successfully");

                alert.show();

                    ReloadSlipPrint print = new ReloadSlipPrint(
                            productReloadList);
                    print.print();

            } else {
                AlertDialog.Builder builder = new AlertDialog.Builder(
                        v.getContext());
                builder.setCancelable(false).setPositiveButton("OK", null);
                AlertDialog alert = builder.create();

                alert.setTitle("ABC Trading");
                alert.setMessage("No Stock To Reload");

                alert.show();
            }

        } catch (Exception e) {
            ABCUtil.displayErrorMsg(v.getContext(), e);
        }
    }
};

Can someone please point me out what is wrong with my code? Any help will be very much appreciated.

도움이 되었습니까?

해결책

Just made up a simple example for you, you can try it.

public class MainActivity extends Activity {

    private ProgressDialog mLoadingDialog;
    private Handler mHandler = new Handler();
    private void showLoadingDialog(final String title, final String msg) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                if(mLoadingDialog == null) {
                    mLoadingDialog = ProgressDialog.show(MainActivity.this, title, msg);
                }
                mLoadingDialog.setTitle(title);
                mLoadingDialog.setMessage(msg);
            }
        });
    }

private void hideLoadingDialog() {
    mHandler.post(new Runnable() { //Make sure it happens in sequence after showLoadingDialog
        @Override
        public void run() {
            if(mLoadingDialog != null) {
                mLoadingDialog.dismiss();
            }
        }
    });
}

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new Thread() {
            @Override
            public void run() {
                showLoadingDialog("Loading", "Please wait...");
                //DO something
                hideLoadingDialog();
            }
        }.start();
    }
}

다른 팁

You can use AsyncTask class to perform long runnning task

below is api link for the same

http://developer.android.com/reference/android/os/AsyncTask.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top