AsyncTask 作为一个单独的类
Posted
技术标签:
【中文标题】AsyncTask 作为一个单独的类【英文标题】:AsyncTask as a separate class 【发布时间】:2016-12-01 00:06:05 【问题描述】:如果我有一个 ,并且我从一个 Activity 运行 AsyncTask,AsyncTask 是否会持有对 Activity 的引用,就像它是后者的内部类一样? 还是解决了内存泄漏的问题?
另外,将包裹在 WeakReference 中的上下文传递给 AsyncTask 是否会做出任何改变?
【问题讨论】:
是的,它将通过传递 Activity 的context
来保存对 Activity 的引用,类似于内部类。
你传递的上下文是什么包装在 WeakReference 中?
为避免内存泄漏,将上下文包装在 WeakReference 中。
所以基本上我们有两种解决内存泄漏的方法,对吧?第一个是静态内部类,第二个是传递给它的 WeakReference 的单独类
参考this链接以更好地理解@BVtp
【参考方案1】:
你可以像这样使用并获得活动的反射
public class DeleteUserTask extends AsyncTask<String, String, String>
private Context context;
private JSONObject Object, Object1;
public static String Success, Exception;
public static boolean isClick;
public DeleteUserTask(Context ctx)
context = ctx;
@Override
protected void onPreExecute()
OrganizationUser_EditProfileScreen.pb.setVisibility(View.VISIBLE);
@Override
protected String doInBackground(String... params)
try
ActivityBase.result = null;
Log.e("", "Request-->" + writeJSON().toString());
ActivityBase.PostMethod(context,
WebServiceLinks.UserStatusButtonTask, writeJSON());
Object = new JSONObject(ActivityBase.result);
Object1 = Object
.getJSONObject("OrganizationUserProfileButtonUpdateResult");
Success = Object1.getString("Success");
Exception = Object1.getString("Exception");
catch (Exception e)
e.printStackTrace();
return null;
@Override
protected void onPostExecute(String result)
try
OrganizationUser_EditProfileScreen.pb.setVisibility(View.GONE);
if (ActivityBase.result != null && Success == "true")
ActivityBase
.GeneralDialog(R.string.account, Exception, context);
catch (Exception e)
e.printStackTrace();
public JSONObject writeJSON()
JSONObject object = new JSONObject();
try
object.put("OrgID", OrganizationLoginTask.OrgID);
object.put("OrgUserID", Search_Screen.OrgUserID);
object.put("Status", OrganizationUser_EditProfileScreen.Status);
object.put("ModifiedByTypeCode", "2");
object.put("ModifiedSourceCode", "8");
catch (Exception e)
e.printStackTrace();
return object;
【讨论】:
很抱歉,但再次 - 这如何解决内存泄漏问题?以上是关于AsyncTask 作为一个单独的类的主要内容,如果未能解决你的问题,请参考以下文章
由于 AsyncTask 是一个单独的类,如何将 OnPostExecute() 的结果获取到主要活动?