Java “异步任务”对话框未被取消
我通过一个异步任务获取一些数据,但它总是显示在屏幕上,从不取消或隐藏。为什么?Java “异步任务”对话框未被取消,java,android,android-asynctask,android-dialog,Java,Android,Android Asynctask,Android Dialog,我通过一个异步任务获取一些数据,但它总是显示在屏幕上,从不取消或隐藏。为什么? public class getJson extends AsyncTask<String,Void,String> { @Override protected void onPreExecute() { super.onPreExecute(); pDialog = new ProgressDialog(kategori.this); pD
public class getJson extends AsyncTask<String,Void,String>
{
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(kategori.this);
pDialog.setMessage("Yükleniyor...");
pDialog.setIndeterminate(true);
pDialog.setCancelable(false); // ProgressDialog u iptal edilemez hale getirdik.
pDialog.show();
}
@Override
protected String doInBackground(String... unused) {
String resString = "";
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://*********.com/api.asp?cmd=katdok&ID="+talepKategori);
try {
HttpResponse response = client.execute(get);
HttpEntity entity;
entity = response.getEntity();
InputStream is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line+ "\n");
}
resString = sb.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return resString;
}
@Override
protected void onPostExecute(String string) {
super.onPostExecute(string);
pDialog.dismiss();
}
}
public类getJson扩展异步任务
{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新进度对话框(kategori.this);
pDialog.setMessage(“Yükleniyor…”);
pDialog.setUndeterminate(真);
pDialog.setCancelable(false);//ProgressDialog u iptal edilemez hale getirdik。
pDialog.show();
}
@凌驾
受保护的字符串背景(字符串…未使用){
字符串resString=“”;
HttpClient=new DefaultHttpClient();
HttpGet=newhttpget(“http://*********.com/api.asp?cmd=katdok&ID=“+talepKategori”);
试一试{
HttpResponse response=client.execute(get);
http实体;
entity=response.getEntity();
InputStream=entity.getContent();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“UTF-8”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
resString=sb.toString();
}
捕获(例外e)
{
e、 printStackTrace();
}
返回字符串;
}
@凌驾
受保护的void onPostExecute(字符串){
onPostExecute(字符串);
pDialog.disclose();
}
}
我使用以下方法来确保任务完成后对话框被关闭
private void hideProgress() {
if (pDialog != null) {
if (pDialog.isShowing()) {
pDialog.dismiss();
pDialog = null;
}
}
}
它避免获取空值并强制关闭对话框。请尝试以下代码
public class getJson extends AsyncTask<String,Void,String>
{
ProgressDialog progressDialog = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(kategori.this,
getResources().getText(R.string.app_name), getResources()
.getText(R.string.wait_message), true);
}
@Override
protected String doInBackground(String... unused) {
String resString = "";
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet("http://*********.com/api.asp?cmd=katdok&ID="+talepKategori);
try {
HttpResponse response = client.execute(get);
HttpEntity entity;
entity = response.getEntity();
InputStream is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line+ "\n");
}
resString = sb.toString();
}
catch (Exception e)
{
e.printStackTrace();
}
return resString;
}
@Override
protected void onPostExecute(String string) {
super.onPostExecute(string);
if(progressDialog.isShowing())
progressDialog.dismiss();
}
}
public类getJson扩展异步任务
{
ProgressDialog=null;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=progressDialog.show(kategori.this,
getResources().getText(R.string.app_name),getResources()
.getText(R.string.wait_消息),true);
}
@凌驾
受保护的字符串背景(字符串…未使用){
字符串resString=“”;
HttpClient=new DefaultHttpClient();
HttpGet=newhttpget(“http://*********.com/api.asp?cmd=katdok&ID=“+talepKategori”);
试一试{
HttpResponse response=client.execute(get);
http实体;
entity=response.getEntity();
InputStream=entity.getContent();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“UTF-8”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
resString=sb.toString();
}
捕获(例外e)
{
e、 printStackTrace();
}
返回字符串;
}
@凌驾
受保护的void onPostExecute(字符串){
onPostExecute(字符串);
if(progressDialog.isShowing())
progressDialog.disclose();
}
}
您是否真的点击了onPostExecute?是pDialog.disclose();调用?replace pDialog=newprogressdialog(kategori.this);使用pDialog=newprogressdialog(getApplicationContext());这对我来说也是同样的问题。希望它可以帮助您尝试删除“super.onPostExecute(string);”。可能是它挡住了你的视线。或者至少调试onPostExecute()并检查是否正在调用Disclease()。不使用此注释..-(你能用完整的类代码更新帖子吗?我想即使在onPostExecute()方法之后也会调用进度对话框。我给你发了一封邮件。我从你的网站上找到了你的邮件地址。我发现了问题。你同时使用了两次getJson()AsyncTask,一次在PopulateListItems()中)另一个在try-catch块中。发生的是这两个AsyncTask一起启动,由于某种原因,进度对话框仍然可见,因为AsyncTask创建了它们两次。解决方案非常简单,请在PopulateListeSM()的开头调用hideProgress()方法。其次,添加另一个hideProgress()在try块的开头(在调用getJson()之前),以便在从onPreExecute()方法创建新对话框之前,它将关闭以前的任何对话框。