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() 的结果获取到主要活动?

AsyncTask介绍

Android攻城狮AsyncTask

让一个 AsyncTask 等待另一个完成?

如果我有一个扩展的单独的类,如何从onPostExecute()获取值 类?

从 Asynctask 更新 MainActivity 上的 ListView