当用户持续点击调用异步任务的按钮时,会出现异常。 那么有没有办法在第二次按下按钮时取消执行第一次异步任务执行。 我希望你能理解这个问题。
我正在使用的代码如下所示。
在按钮上单击使用以下代码
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
}
}
答案 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
,那就更好了。