1

我试图doSomeWork();在我的方法中的 ProgressDialog 消失后执行该方法,该方法printing();似乎与其他方法重叠并且对话框未显示。如果我评论方法doSomeWork();,对话框将正确显示,直到线程完成。

这是我的方法printing();

  public void printing()
{

    final ProgressDialog printingDialog = ProgressDialog.show(this, "Printing...", "Please wait", true, false);

    new Thread(new Runnable() {
        @Override
        public void run() 
        {

          //something big executing here
        }
        }).start();

}

他是我的方法doSomework()

    public void doSomeWork(){

        Thread receiptPrint = new Thread(new Runnable() {

            @Override
            public void run() {

               //something here

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //another dialog here
                    }
                });

            }
            });
}

在这里你可以看到我是如何调用这两种方法的:

    private OnClickListener onClickPrint = new OnClickListener() {

    public void onClick(final View v) {

            Log.d("Button","Clicked on Print Order Button");

                    printing();
                    doSomeWork();

有谁知道doSomeWork()只有在printing();完全完成时我才能执行?

4

3 回答 3

2

您可以使用异步任务而不是使用线程。在 preexecute 方法中显示进度对话框在完成打印操作后调用后台方法中的打印方法调用 postexecute 方法中的 doSomeWork()。

于 2013-03-29T17:50:04.240 回答
2

这是 a 的目的之一AsyncTask。它看起来类似于:

public void onClick(final View v) {

    new AsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {

            //Show your progress dialog in here
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground( Void... params ) {

            printing();
            return null;
        }

        @Override
        protected void onPostExecute( Void result ) {

            //Dismiss your progress dialog here
            doSomeWork();
        }
    }.execute();
}
于 2013-03-29T18:42:57.620 回答
1

你可以Handler在android中使用它。例如考虑下面的一段代码。您可以关闭处理程序中的对话框。可能对你有用。

private void printing(){
  Thread receiptPrint = new Thread(new Runnable() {

        @Override
        public void run() {
            retrieveEmails();

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  try{
                      //here your code executes
                      //after code executes do following:
                      uiHandler.sendEmptyMessage(0);
                  }catch(Exception ex){
                      errorHandler.sendEmptyMessage(0);
                  }
                }
            });

        }
  });
  receiptPrint.start();
}

final Handler uiHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
            //here execute doSomeWork()
    }
};

final Handler errorHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
            //do other stuff
    }
};
于 2013-03-29T17:52:07.190 回答