【问题标题】:AsyncTask as a separate classAsyncTask 作为一个单独的类
【发布时间】:2016-12-01 00:06:05
【问题描述】:

如果我有一个 AsyncTask 作为一个单独的类,并且我从一个 Activity 运行 AsyncTask,AsyncTask 是否会持有对 Activity 的引用,就像它是后者的内部类一样? 还是解决了内存泄漏的问题?

另外,将包裹在 WeakReference 中的上下文传递给 AsyncTask 是否会做出任何改变?

【问题讨论】:

  • 是的,它将通过传递 Activity 的context 来保存对 Activity 的引用,类似于内部类。
  • 你传递的上下文是什么包装在 WeakReference 中?
  • 为避免内存泄漏,将上下文包装在 WeakReference 中。
  • 所以基本上我们有两种解决内存泄漏的方法,对吧?第一个是静态内部类,第二个是传递给它的 WeakReference 的单独类
  • 参考this链接以更好地理解@BVtp

标签: android android-asynctask


【解决方案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;
    }
}

【讨论】:

  • 很抱歉,但再次 - 这如何解决内存泄漏问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多