我创建了一个单独的类,它扩展了我在整个应用程序中用于通信的AsyncTask。我的类的每个活动都使用此AsyncTask类进行通信。我想在通信进行时显示ProgressBar(活动指示符)。如果我在使用通信类的活动中显示和隐藏ProgressBar,则ProgressBar会冻结,直到通信完成。有没有办法在AsyncTask类的屏幕中间显示ProgressBar,因此它不会冻结,并且用户知道后台发生了一些事情。我使用以下代码:
public class MyActivity extends Activity {
ProgressBar spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity_layout);
spinner = (ProgressBar)findViewById(R.Id.progressbar);
spinner.setVisibility(ProgressBar.INVISIBLE);
}
protected void onResume()
{
super.onResume();
}
public void buttonClickHandler(View target){
try{
spinner.setVisibility(ProgressBar.VISIBLE);
String output = new SendRequest().execute().get();
spinner.setVisibility(ProgressBar.INVISIBLE);
}catch(Exception ex){
System.out.println("buttonClickHandler exception: "+ex);
}
}
}
和AsyncTask类是:
public class SendRequestExample extends AsyncTask<ArrayList<String>, Void, String> {
public String result;
protected String doInBackground(ArrayList<String>... params) {
// doing communication
...
return result;
}
}
提前致谢。
答案 0 :(得分:5)
您应该在以下位置显示进度条:
SendRequestExample.onPreExecute()
并将其隐藏在:
SendRequestExample.onPostExecute()
方法
如果您的SendRequestExample对于许多活动都是通用的,那么您可以创建MyActivity实现界面,即:
interface ProgressBarAware {
void showProgressbar();
void hideProgressbar();
}
并将ProgressBarAware引用传递给AsyncTask。在配置更改期间更新AsyncTask中的此引用非常重要,这意味着每次在配置更改后执行Activity.onCreate。
还有一个:不要在UI线程上的asynctask上使用get(),在调用'new SendRequest()。execute()。get();'。这会导致很多问题。它阻止Android使用的消息队列来处理负责响应用户点击,绘制小部件等的消息。几分钟后,这样的UI线程阻塞将在ANR(应用程序没有响应)中结束,系统将终止您的应用程序。
答案 1 :(得分:1)
Every activity of my class uses this AsyncTask class for communication
在AsyncTask中使用ProgressDialog
public class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
private ProgressDialog pDialog ;
protected void onPreExecute() {
m_logger.d("onPreExecute");
pDialog = new ProgressDialog(m_applicationContext);
pDialog.setCancelable(false);
pDialog.show();
....
}
protected void onPostExecute(Intent result)
{
if( null != pDialog)
pDialog.dismiss();
.....
}
}
答案 2 :(得分:0)
您无需在ProgressDialog
内部声明Activity(s)
。相反,您可以像ProgressDialog
一样在AsyncTask
内创建public class SendRequestExample extends AsyncTask<ArrayList<String>, Void, String> {
ProgressDialog pdialog = new ProgressDialog(yourcontexthere);
....
@Override
protected void onPreExecute() {
super.onPreExecute();
pdialog.setCancelable(false);
pdialog.setTitle("Please wait.");
pdialog.setMessage("doing stuff...");
pdialog.show();
}
@Override
protected String doInBackground(String... params) {
// doing stuff
...
return result;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if(pdialog.isShowing())
pdialog.dismiss();
...
}
}
。
{{1}}
希望这有帮助。
答案 3 :(得分:0)
在XML中隐藏ProgressBar,然后按照以下步骤操作。
public class MainActivity extends Activity {
ProgressBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bar = (ProgressBar) findViewById(R.id.progressBar1);
new MyTask().execute();
}
class MyTask extends AsyncTask<Void, Void, Void>{
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
bar.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
bar.setVisibility(View.GONE);
}
}
}