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()方法创建新对话框之前,它将关闭以前的任何对话框。