我有一个链接到刷新按钮的AsyncTask(当我点击我的刷新按钮时,我的AsyncTask被调用)。
我在我的布局上有一个ProgressBay的LinearLayout字段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="@color/grey">
<Button android:id="@+id/refresh_p"
android:text="@string/refresh_promo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/custom_button1"/>
<LinearLayout android:id="@+id/linearlayoutProgressBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:listSelector="@color/tabTransparent"
android:cacheColorHint="#00000000"/>
<!-- <ListView android:id="@+id/list_promo"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>-->
</LinearLayout>
在我的AsyncTask中:
@Override
protected void onPreExecute()
{
super.onPreExecute();
pb = new ProgressBar(context);
LinearLayout ll = (LinearLayout) ((Activity) context).findViewById(R.id.linearlayoutProgressBar);
ll.addView(pb);
pb.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> promoList)
{
...
if (pb!=null)
{
pb.setVisibility(View.GONE);
((LinearLayout)pb.getParent()).removeView(pb);
}
}
我遇到的问题是当我在刷新按钮上点击超过2次,然后多个ProgressBar显示在屏幕上..我只是想让新的ProgressBar替换旧的相同位置..
答案 0 :(得分:0)
我的猜测是你可能以类似的方式开始你的AsyncTask:
new RefreshTask().execute(params);
而不是在您的活动中创建一个实例变量。假设这被命名为mTask并用以上代码替换以下调用:
if(mTask != null && mTask.getState != AsyncTask.State.RUNNING){
mTask = new RefreshTask();
mTask.execute(params);
}
这样,您将确保在给定时间只有一个任务实例正在运行,并且用户必须等到刷新完成才能开始新的刷新。
如果您希望用户能够取消现有刷新任务并运行新任务,则必须在开始新任务之前取消旧任务:
if(mTask != null){
if(mTask.getStatus() == AsyncTask.Status.RUNNING){
mTask.cancel(true);
}
mTask = new RefreshTask();
mTask.execute(params);
}
这样,旧任务及其ProgressBar将被新任务正确替换。