无法取消异步任务执行

时间:2014-06-17 10:02:02

标签: java android

当用户持续点击调用异步任务的按钮时,会出现异常。 那么有没有办法在第二次按下按钮时取消执行第一次异步任务执行。 我希望你能理解这个问题。

我正在使用的代码如下所示。

在按钮上单击使用以下代码

        GetData obj= new GetData();
        String urls="http://pathramonline.com/?cat=46";
        obj.execute(urls);

我的异步任务

    public class GetData extends AsyncTask<String, Void, String>{

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub

            BufferedReader reader =null;
            String data =null;

            try{

                HttpClient client = new DefaultHttpClient();
                URI uri=new URI(params[0]);

                HttpGet get =new HttpGet(uri);

                HttpResponse response= client.execute(get);

                InputStream stream=response.getEntity().getContent();

                reader = new BufferedReader(new InputStreamReader(stream));

                StringBuffer buffer =new StringBuffer("");
                String line="";
                String newLine= System.getProperty("line.separator");

                while((line=reader.readLine())!=null){
                    buffer.append(line+newLine);
                }
                reader.close();
                data = buffer.toString();


                return data;

            }
            catch(URISyntaxException e){
                e.printStackTrace();
            }
            catch(ClientProtocolException f){
                f.printStackTrace();
            }
            catch(IOException g){
                g.printStackTrace();
            }
            catch(Exception e)
            {
            //
            }
            finally{
                if(reader!=null){
                    try{
                        reader.close();
                    }
                    catch(Exception e){

                    }
                }
            }

            return null;
        }
         @Override
            protected void onCancelled() {


            }
        @Override
        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            //TextView t3=(TextView)findViewById(R.id.textView3);
            if(result==null)
            {
            Intent home = new Intent(MainActivity.this,NoConnection.class);
            MainActivity.this.startActivity(home);
            MainActivity.this.finish();
            }

            //Some actions
        }
  }

2 个答案:

答案 0 :(得分:1)

我建议使用另一种方法,而不是取消asynctask。 在onPreExecute()方法中,禁用按钮单击

button.setEnabled(false);

在onPostExecute()方法中启用按钮

button.setEnabled(true);

如果您明确想要知道该按钮被禁用,那么在执行asynctask时您可以将按钮的背景颜色更改为其他颜色或背景,以便用户知道正在执行某些功能,并且他需要等待..

另一种方法是

new AsyncTask<Void, Void, Void>() {

            String result = "";
            ProgressDialog progressDialog = null;

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                progressDialog = new ProgressDialog(getActivity());
                progressDialog.setMessage("Loading , Please wait...");
                progressDialog.setIndeterminate(true);
                progressDialog.setCanceledOnTouchOutside(false);
                progressDialog.show();
                super.onPreExecute();
            }

            @Override
            protected Void doInBackground(Void... params) {
                // TODO Auto-generated method stub
                String url = "your link comes here"



                JSONObject jsonObject = jpass.getJSONFromUrl(url);

                try {
                    //do your work here 

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void a) {
                // TODO Auto-generated method stub
                progressDialog.dismiss();

                if (result.equals("success")) {
                    //on success do some work here 
                }
                else
                {
                    //on failure do some work here 
                }
                super.onPostExecute(a);
            }

        }.execute();

答案 1 :(得分:0)

不要取消AsyncTask,只需将按钮的点击监听器设为null,然后再将其设置在onPostExecute的{​​{1}}内。如果在执行AsyncTask代码时显示ProgressBar,那就更好了。