Pis*_*ean 3 android android-layout android-progressbar android-asynctask android-activity
我创建了一个单独的类,它扩展了我在整个应用程序中用于通信的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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
和AsyncTask类是:
public class SendRequestExample extends AsyncTask<ArrayList<String>, Void, String> {
public String result;
protected String doInBackground(ArrayList<String>... params) {
// doing communication
...
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
您应该在以下位置显示进度条:
SendRequestExample.onPreExecute()
Run Code Online (Sandbox Code Playgroud)
并将其隐藏在:
SendRequestExample.onPostExecute()
Run Code Online (Sandbox Code Playgroud)
方法.
如果您的SendRequestExample对于许多活动是通用的,那么您可以使MyActivity实现接口,即:
interface ProgressBarAware {
void showProgressbar();
void hideProgressbar();
}
Run Code Online (Sandbox Code Playgroud)
并将ProgressBarAware引用传递给您的AsyncTask.在配置更改期间更新AsyncTask中的此引用很重要,这意味着每次Activity.onCreate在配置更改后执行.
还有一个:不要在UI线程上的asynctask上使用get(),在调用'new SendRequest().execute().get();'.这会导致很多问题.它阻止Android使用的消息队列来处理负责响应用户点击,绘制小部件等的消息.几分钟后,这样的UI线程阻塞将最终出现在ANR(应用程序没有响应)中,系统将终止您的应用程序.
| 归档时间: |
|
| 查看次数: |
4409 次 |
| 最近记录: |