我的Android项目中有一个MainActivity
类。在其中,我有AsyncTask
使用我的API REST的Cars
方法检索有关GET
的所有信息,我想将它们添加到我在我的ArrayList中MainActivity
课程。因此,我想在我的AsyncTask完成的同时添加一个ProgressDialog
。
我已将我的ProgressDialog声明为MainActivity的顶部:
private ProgressDialog progressDialog;
此外,我ArrayList
顶部定义了MainActivity
辆汽车:
ArrayList<Car> cars = new ArrayList<Car>(); //This is the ArrayList that I have on my MainActivity class
然后,我运行AsyncTask
并在我的ProgressDialog
课程的onCreate
方法中初始化我的MainActivity
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("Loading...");
progressDialog.setCancelable(true);
progressDialog.setMax(100);
new chargeCars().execute();
}
这就是我的AsyncTask:
class chargeCars extends AsyncTask<Void, Integer, Boolean> {
protected void onPreExecute(){
progressDialog.setProgress(0);
progressDialog.show();
}
protected Boolean doInBackground(Void... params) {
//Here all the code to get my information from an HTTP Response, the data it's retrieving OK.
//Here there is a for loop to add all the elements to my ArrayList cars.
{
cars.add(new Car(idCar, model));
publishProgress(10);
if(isCancelled())
break;
}
publishProgress(100);
return true;
}
protected void onProgressUpdate(Integer... values){
int progress = values[0].intValue();
progressDialog.setProgress(progress);
}
protected void onPostExecute(boolean c){
if(c)
{
Toast.makeText(MainActivity.this, "Finished task!",
Toast.LENGTH_SHORT).show();
}
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss();
}
}
protected void onCancelled() {
Toast.makeText(MainActivity.this, "Canceled task",
Toast.LENGTH_SHORT).show();
}
}
问题是ProgressDialog
永远不会结束,它始终在屏幕上。为什么总是显示?我的AsyncTask总是在运行吗?永远不会结束?
注意:我的HTTP响应的信息来自我的API REST,因为我在检索到信息之后放了一些日志并且它是正确的,显然它存储在ArrayList
(我在将信息添加到ArrayList
之后也添加了一些日志,它会为我提供存储的信息)但是当我在cars.size()
上执行AsyncTask
后{} {1}}方法告诉我,它的大小等于0.这就是我将onCreate()
放入ProgressDialog
内部的原因,因为我认为它也许还没有完成,然后我确保AsyncTask已经完成。这可能是解决方案吗?我还要做出另一个改变吗?
请带我点亮,因为我完全阻止了。
编辑:我编辑了我的代码。
EIDT 2:随着代码的更新,当我触摸手机屏幕时,ProgressDialog只会消失。在其他情况下,它不会消失。
提前致谢!
答案 0 :(得分:0)
在你的onPostExecute add中,
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss();
}
答案 1 :(得分:0)
使用dismiss()
方法!
@override
protected void onPostExecute(boolean c){
if(c)
{
Toast.makeText(MainActivity.this, "Finished task!",
Toast.LENGTH_SHORT).show();
}
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss();
}
}
解雇()
在API级别1中添加关闭此对话框,将其从屏幕中删除。 可以从任何线程安全地调用此方法。请注意你 当对话框出现时,不应该覆盖此方法来进行清理 被解雇,而是在onStop()中实现。
答案 2 :(得分:0)
问题是,onPause
中的方法onDestroy
和AsyncTask
不会覆盖类中的任何内容,因此永远不会被调用。如果在AsyncTask
完成时需要完成某些操作,则将其放在方法onPostExecute
(在UI线程上运行)中。您应该删除这两种方法(因为它们无用)并按如下方式设置onPostExecute方法:
protected void onPostExecute(boolean c){
if(c) {
Toast.makeText(MainActivity.this, "Finished task!",
Toast.LENGTH_SHORT).show();
}
if(progressDialog != null && progressDialog.isShowing()){
progressDialog.dismiss();
}
}
有关AsyncTask