在类

时间:2015-06-19 14:39:47

标签: android android-progressbar android-runonuithread

是否有更简单/更简单的方法来执行以下操作?我在类中有一个方法,在线程运行时显示进度条。这段代码有效,但看起来有点过于笨重,有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);
            }
        });

}

2 个答案:

答案 0 :(得分: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();

对于" slicker"您可以使用为此任务创建的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();

答案 1 :(得分:0)

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

是的,

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();

我希望这个会帮助你:)。