Java 从AsyncTask ProgressDialog取消AsyncTask
(这与空指针无关): 我在AsyncTask中有一个进度条,并添加了一个取消按钮来取消AsyncTask 我可以从asynctask外部取消asynctask,但我需要在progressdialog中实现cancel函数,该函数在asynctask下实现 因此,问题是如何使用在asynctask下的progressdialog中实现的cancel按钮取消asynctask 请签入“doInBackground”。异步任务不会被取消 下载_result.java类:Java 从AsyncTask ProgressDialog取消AsyncTask,java,android,android-studio,android-asynctask,Java,Android,Android Studio,Android Asynctask,(这与空指针无关): 我在AsyncTask中有一个进度条,并添加了一个取消按钮来取消AsyncTask 我可以从asynctask外部取消asynctask,但我需要在progressdialog中实现cancel函数,该函数在asynctask下实现 因此,问题是如何使用在asynctask下的progressdialog中实现的cancel按钮取消asynctask 请签入“doInBackground”。异步任务不会被取消 下载_result.java类: public class Do
public class Download_result extends AsyncTask<String,Integer,Void>{
ProgressDialog progressDialog;
Context context;
String pdfFile;
Download_result(Context context, String pdfFile){
this.context=context;
this.pdfFile=pdfFile;
}
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Downloading...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(200);
progressDialog.setCancelable(false);
progressDialog.setProgress(0);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Download_result.this.cancel(true);
dialog.dismiss();
}
});
progressDialog.show();
}
@Override
protected Void doInBackground(String... params) {
//given below
}
@Override
protected void onProgressUpdate(Integer... values) {
progressDialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(Void result) {
progressDialog.cancel();
}
}
在AsyncTask中创建一个“boolean keepGoing”,并将其设置为true。在您的“doInBackground”程序中,定期对其进行轮询,如果为false,则返回。将取消按钮绑定到AsyncTask中的setter,该setter将“keepGoing”标志设置为false。这应该可以完成任务。在AsyncTask中创建一个“boolean keepGoing”,并将其设置为true。在您的“doInBackground”程序中,定期对其进行轮询,如果为false,则返回。将取消按钮绑定到AsyncTask中的setter,该setter将“keepGoing”标志设置为false。这应该可以完成任务。您没有在“取消”按钮按下中取消对话框。。也可以使用设置按钮 试试这个:
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Downloading...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(200);
progressDialog.setCancelable(false);
progressDialog.setProgress(0);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
download.cancel(true);
downloadstatus=false; //add boolean check
dialog.dismiss();
}
});
progressDialog.show();
}
要取消异步任务,请使用:
Public Download_result download;
download = new Download_result();
download.execute();
download.cancel(true);
在doInbackGround
()
您尚未在“取消”按钮按下中取消对话框。。也可以使用设置按钮 试试这个:
@Override
protected void onPreExecute() {
progressDialog = new ProgressDialog(context);
progressDialog.setTitle("Downloading...");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(200);
progressDialog.setCancelable(false);
progressDialog.setProgress(0);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
download.cancel(true);
downloadstatus=false; //add boolean check
dialog.dismiss();
}
});
progressDialog.show();
}
要取消异步任务,请使用:
Public Download_result download;
download = new Download_result();
download.execute();
download.cancel(true);
在doInbackGround
()
在ProgressDialog的按钮上使用DialogInterface listener,例如:
protected void onPreExecute() {
pd = new ProgressDialog(MainActivity.this);
pd.setTitle("PAUL app");
pd.setMessage("Loading data ...");
pd.setButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// User has cancelled task ... just quit!
MainActivity.this.finish();
return;
}
});
pd.show();
}
在ProgressDialog的按钮上使用DialogInterface listener,例如:
protected void onPreExecute() {
pd = new ProgressDialog(MainActivity.this);
pd.setTitle("PAUL app");
pd.setMessage("Loading data ...");
pd.setButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// User has cancelled task ... just quit!
MainActivity.this.finish();
return;
}
});
pd.show();
}
将Download\u结果
作为参数发送给自己的构造函数没有任何意义。您永远不能拥有有效的引用来传递构造函数。您应该将此构造函数更改为
Download_result(Context context, String pdfFile)
Download\u result
的每个方法都已经引用了一个名为this
的Download\u result
对象。由于您需要在内部类中访问它,请使用下载\u结果。此:
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Download_result.this.cancel(true);
dialog.dismiss();
}
});
将Download\u结果
作为参数发送给自己的构造函数没有任何意义。您永远不能拥有有效的引用来传递构造函数。您应该将此构造函数更改为
Download_result(Context context, String pdfFile)
Download\u result
的每个方法都已经引用了一个名为this
的Download\u result
对象。由于您需要在内部类中访问它,请使用下载\u结果。此:
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Download_result.this.cancel(true);
dialog.dismiss();
}
});
张贴碰撞日志可能重复的请显示导致NPE的日志和代码。一定要清楚地指出崩溃发生的确切代码行。@code peedient编辑检查…请检查在com.************.result.Download_result$1.onClick(Download_result.java:62)
Download_result.java的第62行是什么?发布崩溃日志可能重复的请显示日志和导致NPE的代码。一定要清楚地指出崩溃发生的确切代码行。@code peedient编辑检查…请检查在com.************.result.Download_result$1.onClick(Download_result.java:62)
Download_result.java的第62行是什么?相同的结果…实际上我也在使用setButton..参见我编辑的帖子,看看我在哪里nullpointer@wangz您的下载结果是什么。java:62
行?Download\u result.java是一个类,我在其中实现了上述代码(asynctask),而“Download.cancel(true)”在62行…要正确取消异步任务,您必须使用..myTask.cancel(true)代码>由于您的下载
为空,因此会导致异常..thanx,虽然我已经实现了code Peedient建议的内容,但逻辑仍然相同,现在我没有收到任何空指针异常。但无论如何异步任务都不会被取消,我会在文件管理器中获得下载的文件。我想中途取消。我可能在我的“doInBackground”中犯了一些错误请帮我检查…请检查结果…实际上我也在使用setButton…查看我编辑的帖子,检查我得到了什么nullpointer@wangz您的Download\u result.java:62
行是什么?Download\u result.java是一个类,我在其中实现了上述代码(asynctask)和“Download.cancel”(true)“在62行中…要正确取消异步任务,必须使用..myTask.cancel(true)
由于您的下载为空,它会导致异常..thanx,虽然我已经实现了code Peedient建议的内容,但逻辑仍然是一样的,现在我没有收到任何空指针异常。但是无论如何,asynctask没有得到取消,我在文件管理器中得到下载的文件。我希望它在中途被取消。我可能在我的“工作背景”中犯了一些错误请帮我检查一下。请帮我取消任务人,删除活动不会取消后台活动我想取消任务人,删除活动不会取消后台活动我有点困惑,你不只是编辑我的代码并发布在这里我有点困惑,你不只是编辑我的代码并发布在这里谢谢,现在我不是ge正在处理nullpointer异常。但asynctask仍然没有得到取消。我在文件管理器中得到了下载的文件。我可能在“doInBackground”中犯了一些错误。请帮我检查一下。@wangz这是因为您只检查一次isCancelled()
,就像检查doInBackground()一样
开始。您需要定期检查此值,以检测异步任务是否被取消。@wangz您应该发布一个新问题,因为您原来的问题已经得到了回答。请随时链接到此问题以提供上下文。主要问题是取消异步任务,但尚未解决:(@wangz原来的问题是关于一个NPE的。这个问题已经解决了。请发布一个新问题以获得进一步的帮助。评论和编辑只是为了澄清,而不是完全改变问题。谢谢,现在我没有得到任何帮助