0

是否有更流畅/更简单的方法来执行以下操作?我在一个类中有一个方法,它在线程运行时显示进度条。这段代码有效,但它看起来有点过于笨拙,有 3 个步骤。

private void pause() {
        mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mProgressBar.setVisibility(View.VISIBLE);
            }
        });

        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //do stuff
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

        mActivity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mProgressBar.setVisibility(View.GONE);
            }
        });

}
4

2 回答 2

0

这不会在线程运行时显示进度条。

您的线程可以运行 10 秒,但 ProgressBar 的可见性只有在您可以看到时才会闪烁。

相反,您应该只在线程完成后隐藏,所以这是正确的:

mActivity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        mProgressBar.setVisibility(View.VISIBLE);
    }
});

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            //do stuff


            mActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mProgressBar.setVisibility(View.GONE);
                }
            });
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

对于“更流畅”的方式,您可以使用为此任务创建的 AsyncTask。例子:

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

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Guaranteed to run on the UI thread
        mProgressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected Void doInBackground(Void... params) {
        // Do stuff
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // Guaranteed to run on the UI thread
        mProgressBar.setVisibility(View.GONE);

    }

}.execute();
于 2015-06-19T14:46:28.867 回答
0

在这里,您可以使用处理程序概念与 UI 线程进行通信。

IE,

Handler handler=new Handler(){
 @Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
  switch(msg.what){
case 1:
mProgressBar.setVisibility(View.VISIBLE);
break;
case 2:
mProgressBar.setVisibility(View.GONE);
break;  
}
  }
 } 

 new Thread(new Runnable() {
        @Override
        public void run() {
  Message processStart = handler.obtainMessage(1);
    processStart.sendToTarget();
            try {
                //do stuff
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    Message processStart = handler.obtainMessage(2);
    processStart.sendToTarget();
        }

    }).start();

我希望这个对你有帮助:)

于 2015-06-19T14:47:44.853 回答