如何在android中完成onCancelled()方法上的AsyncTask
我试图完成名为DownloadSong的AsyncTask,同时取消AsyncTask,但它将nullPointerException作为错误。如何在onCancelled()上完成异步任务如何在android中完成onCancelled()方法上的AsyncTask,android,android-asynctask,nullpointerexception,activity-finish,Android,Android Asynctask,Nullpointerexception,Activity Finish,我试图完成名为DownloadSong的AsyncTask,同时取消AsyncTask,但它将nullPointerException作为错误。如何在onCancelled()上完成异步任务 public class DownloadSong extends AsyncTask<String, Integer, String> { Context context; Activity activity; public static String songName, songURL;
public class DownloadSong extends AsyncTask<String, Integer, String> {
Context context;
Activity activity;
public static String songName, songURL;
private NotificationHelper mNotificationHelper;
public static int notificationID = 1;
boolean download = false;
DownloadSong asynk;
public DownloadSong()
{
this.activity=activity;
}
public DownloadSong(Activity activity, String songName, String songURL) {
this.activity = activity;
this.songName = songName;
this.songURL = songURL;
mNotificationHelper = new NotificationHelper(activity, songName);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
notificationID++;
mNotificationHelper.createNotification(notificationID);
}
@Override
protected String doInBackground(String... file_URL) {
try {
URL url = new URL(songURL);
HttpURLConnection URLconnection = (HttpURLConnection) url.openConnection();
URLconnection.setRequestMethod("GET");
URLconnection.setDoOutput(true);
URLconnection.connect();
// Detect the file length
int fileLength = URLconnection.getContentLength();
File fSDcard = Environment.getExternalStorageDirectory();
String strSdcardPath = fSDcard.getAbsolutePath();
File fDirectory = new File(strSdcardPath + "/GSD");
if (!fDirectory.exists()) {
fDirectory.mkdir();
}
File fMyFile = new File(fDirectory.getAbsolutePath() + "/" + songName + ".mp3");
Log.e("Download file name ", fMyFile.toString());
FileOutputStream out = new FileOutputStream(fMyFile, true);
InputStream input_File = URLconnection.getInputStream();
byte[] data = new byte[1024];
int total = 0;
int count;
while ((count = input_File.read(data)) != -1 && !isCancelled()) {
total += count;
publishProgress((int) (total * 100 / fileLength));
out.write(data, 0, count);
}
out.flush();
out.close();
input_File.close();
} catch (IOException e) {
Log.e("Download Error : ", "Failed");
}
Log.e("Download status", " Complete ");
return null;
}
@Override
protected void onPostExecute(String s) {
if (download) {
mNotificationHelper.clearNotification();
Toast.makeText(activity, "Could Not Connect to Server.", Toast.LENGTH_LONG).show();
Log.e("download","could not connect to server");
} else {
mNotificationHelper.completed();
try {
Toast.makeText(activity, "Song " + "'" + songName + "'" + " downloaded successfully", Toast.LENGTH_LONG).show();
}catch (Exception e)
{
Toast.makeText(activity, "Song downloaded successfully", Toast.LENGTH_LONG).show();
}
Log.e("download", "completed");
}
}
@Override
protected void onProgressUpdate(Integer... progress) {
mNotificationHelper.progressUpdate(progress[0]);
super.onProgressUpdate(progress);
}
@Override
protected void onCancelled() {
super.onCancelled();
asynk.activity.finish();
}}
但它给出了如下致命错误:
Process: com.dnk.gsd, PID: 31934
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Activity.finish()' on a null object reference
at com.dnk.gsd.DownloadSong.onCancelled(DownloadSong.java:144)
at android.os.AsyncTask.onCancelled(AsyncTask.java:405)
at android.os.AsyncTask.finish(AsyncTask.java:630)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:194)
at android.app.ActivityThread.main(ActivityThread.java:5576)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:956)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:751)
nullPointerException的问题不是因为您取消了AsyncTask,而是因为您试图完成调用方活动。您的活动可能在AsyncTask完成其进程之前被销毁。因此,使用
Activity activity;
改为:
WeakReference<Activity> activityWeakRef;
在你的一次取消()中:
以下更改将避免泄漏活动和nullPointerException
--更新--
您可以阅读以下有关终止异步任务的QA:
--新更新--
要确保活动不为空,请始终检查它。更改为:
@Override
protected void onCancelled() {
if(activityWeakRef.get() != null) {
activityWeakRef.get().finish();
}
super.onCancelled();
}
--新更新--
记住将默认contstructor设置为private,并删除那里的活动初始化。从以下代码:
public DownloadSong()
{
this.activity=activity;
}
到
这将确保您不会在未初始化活动的情况下意外创建新的AsyncTask。nullPointerException的问题不是因为您取消了AsyncTask,而是因为您试图完成调用方活动。您的活动可能在AsyncTask完成其进程之前被销毁。因此,使用
Activity activity;
改为:
WeakReference<Activity> activityWeakRef;
在你的一次取消()中:
以下更改将避免泄漏活动和nullPointerException
--更新--
您可以阅读以下有关终止异步任务的QA:
--新更新--
要确保活动不为空,请始终检查它。更改为:
@Override
protected void onCancelled() {
if(activityWeakRef.get() != null) {
activityWeakRef.get().finish();
}
super.onCancelled();
}
--新更新--
记住将默认contstructor设置为private,并删除那里的活动初始化。从以下代码:
public DownloadSong()
{
this.activity=activity;
}
到
这将确保您不会在未初始化活动的情况下意外创建新的AsyncTask。但它仍会给出一个错误,即java.lang.NullPointerException:尝试调用虚拟方法'java.lang.Object java.lang.ref.WeakReference.get()'on a null object reference.java.lang.NullPointerException:尝试在com.dnk.gsd.DownloadSong.onCancelled(DownloadSong.java:150)@urvashibalala:change on cancelled上对null对象引用调用虚拟方法'java.lang.object java.lang.ref.WeakReference.get()'。Activity=activityWeakRef.get();如果(activity!=null){activity.finish()}super.onCancelled();尽管如此,它还是给出了一个错误:java.lang.NullPointerException:尝试在null对象引用上调用虚拟方法“java.lang.Object java.lang.ref.WeakReference.get()”。java.lang.NullPointerException:尝试调用虚拟方法“java.lang.Object java.lang.ref.WeakReference.get())'在com.dnk.gsd.DownloadSong.onCancelled(DownloadSong.java:150)上的空对象引用上@urvashibalala:change on已取消对此的更改。Activity=activityWeakRef.get();如果(activity!=null){activity.finish()}super.onCancelled();您的BroadcastReceiver仍然没有初始化Activity,因此Activity.finish()将指向null对象。在仔细阅读您的代码后,我发现您主要将Activity用于Toast和notification,对吗?。它可以用上下文代替。因此,使用上下文上下文并删除活动;也许我们可以通过网络聊天。查找用户:IsNotMenow您的BroadcastReceiver仍然没有初始化Activity,因此Activity.finish()将指向null对象。在仔细阅读您的代码后,我发现您主要使用Activity进行Toast和notification,对吗?。它可以用上下文代替。因此,使用上下文上下文并删除活动;也许我们可以通过网络聊天。查找用户:isnotmenow
private DownloadSong()
{
}