相关疑难解决方法(0)

Java内部类和静态嵌套类

Java中的内部类和静态嵌套类之间的主要区别是什么?设计/实施是否在选择其中一个方面发挥作用?

java inner-classes static-classes

1691
推荐指数
21
解决办法
70万
查看次数

RecyclerView Adapter中静态和非静态视图的区别是什么?

这种方法的优点是什么(在我的类MyAdapter中使用静态嵌套类扩展了RecyclerView.Adapter):

static class MyVH extends RecyclerView.ViewHolder {...}
Run Code Online (Sandbox Code Playgroud)

而这种方法(使用成员内部类):

  class MyVH extends RecyclerView.ViewHolder {...}
Run Code Online (Sandbox Code Playgroud)

或者它不会影响性能,可以使用这两种方法吗?

static android android-viewholder android-recyclerview

63
推荐指数
2
解决办法
1万
查看次数

在ViewHolder模式中将ViewHolder设置为静态对性能至关重要吗?

ViewHolder模式中将ViewHolder设置为静态对性能至关重要吗?

ViewHolder对象将每个组件视图存储在Layout的标记字段中,因此您可以立即访问它们而无需重复查找它们.首先,您需要创建一个类来保存您的确切视图集.例如:

static class ViewHolder {
  TextView text;
  TextView timestamp;
  ImageView icon;
  ProgressBar progress;
  int position;
}
Run Code Online (Sandbox Code Playgroud)

performance android listview

13
推荐指数
1
解决办法
5004
查看次数

为什么异步网络调用的回调方法在活动结束后不会导致内存泄漏?

我们知道匿名内部类可能会导致内存泄漏.但是为什么它在异步网络调用时不起作用.
例如:

OkHttpClient client = new OkHttpClient();

 Request request = new Request.Builder()
                .get()
                .url(url)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                // String str = response.body().string();
                // do sth to our View, but those views may be null when activity finished
                }

            }
        });
Run Code Online (Sandbox Code Playgroud)

我们将在回调方法调用时更改视图的状态,但这些视图在活动完成时始终为null.为什么这个用于回调的匿名内部类实例不会导致活动泄漏.

java android jvm okhttp

12
推荐指数
1
解决办法
889
查看次数

FusedLocationProviderClient.removeLocationUpdates始终返回失败

我有一个activity扩展基地class称为LocationAwareActivity所有这样LocationAwareActivity activity做是创建一个位置服务客户端

LocationServices.getFusedLocationProviderClientlistens位置更新.

此活动的来源是 https://github.com/snijsure/MultiActivity/blob/master/app/src/main/java/com/example/subodhnijsure/multiactivity/LocationAwareActivity.java

当活动被破坏时,它会打电话removeLocationUpdates.我发现的是

  • removeLocationUpdate 返回始终返回不成功的任务
  • 更令人担忧的是因为没有删除位置活动,所以activity没有被垃圾收集.

在此输入图像描述 - 因此,如果我启动从LocationAwareActivity该活动继承的任何活动始终保持在堆上.

所以问题是什么是停止接收位置更新的正确方法,从而允许activity垃圾收集.

可以在此处访问此项目的整个源代码 - https://github.com/snijsure/MultiActivity

java android android-location

11
推荐指数
2
解决办法
3370
查看次数

凌空请求的匿名侦听器导致内存泄漏

我正在使用排球库进行网络服务调用.我创建了一个通用类,用于调用所有Web服务并从那里进行服务调用,并为成功和错误响应提供匿名侦听器.

但是当我使用泄漏金丝雀时,它显示出与上下文相关的内存泄漏.以下是我的代码片段:

public void sendRequest(final int url, final Context context, final ResponseListener responseListener, final Map<String, String> params) {
    StringRequest stringRequest;
    if (isNetworkAvailable(context)) {

      stringRequest = new StringRequest(methodType, actualURL + appendUrl, new Listener<String>() {
            @Override
            public void onResponse(String response) {
                dismissProgressDialog(context);
                try {
                    (responseListener).onResponse(url, response);
                } catch (JsonSyntaxException e) {
                    // Util.showToast(context, context.getResources().getString(R.string.error));
                    Crashlytics.logException(e);
                }
            }

        }, new ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                // Util.showToast(context,context.getString(R.string.error));

                dismissProgressDialog(context);
                if (error instanceof NetworkError) {
                     Util.showToast(context, context.getResources().getString(R.string.network_error));
                } else if (error instanceof …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks web-services android-volley leakcanary

7
推荐指数
2
解决办法
2916
查看次数

Android:如何在应用程序中测试内存泄漏?

我开发了一个应用程序,我想检查应用程序中发生的内存泄漏.我正在尝试使用eclipse MAT,但不成功,我正在获取HROF文件但是eclipse MAT无法读取它.任何人都可以帮助我.找到任何其他方式.

android memory-leaks android-emulator

6
推荐指数
1
解决办法
2977
查看次数

RecyclerView RecyclerViewDataObserver未注册

林有工作RecyclerView,SyncAdaptergreenrobot eventbus 当我SyncAdapter完成syincing我发布一条消息到消息总线:

EventBus.getDefault().post(new EventMessagesRefreshed());
Run Code Online (Sandbox Code Playgroud)

在我的目标类中,我执行以下操作:

@Subscribe
public void onEvent(EventMessagesRefreshed event) {
    this.init();
}
Run Code Online (Sandbox Code Playgroud)

在我的init()i中为recyclerview创建适配器并设置它:

public void init() {
    if(this.listRowParent != null) {
        this.adapter = new FragmentMessagesListAdapter(this.getActivity(), SingletonMessages.getInstance().getMessages());
        this.listRowParent.setAdapter(this.adapter);
    }
}

// listRowParent is my RecyclerView!
Run Code Online (Sandbox Code Playgroud)

接收事件的片段位于选项卡视图的内部.因此,当我不在正确的目标选项卡中时,有多个选项卡,有时还有消息总线中的SyncAdapter帖子,EventMessagesRefreshed但由于它已注册,它会尝试调用init()并创建适配器并将其设置为RecyclerView.如果发生这种情况,我会收到以下错误:

Could not dispatch event: class EventMessagesRefreshed to subscribing class class FragmentMessagesList
java.lang.IllegalStateException: Observer android.support.v7.widget.RecyclerView$RecyclerViewDataObserver@2c3421a7 was not registered.
    at android.database.Observable.unregisterObserver(Observable.java:69)
    at android.support.v7.widget.RecyclerView$Adapter.unregisterAdapterDataObserver(RecyclerView.java:5688)
    at android.support.v7.widget.RecyclerView.setAdapterInternal(RecyclerView.java:873)
    at android.support.v7.widget.RecyclerView.setAdapter(RecyclerView.java:857)
Run Code Online (Sandbox Code Playgroud)

所以我需要 …

android greenrobot-eventbus android-recyclerview

6
推荐指数
1
解决办法
5945
查看次数

Android onClickListener实现最佳实践

有四种方法可以将onClickListener添加到可单击的视图(例如按钮):

  1. 在布局文件中设置onClick属性,该属性指向活动中的方法,
  2. 创建一个匿名内部类,
  3. 将onClickListener分配给私有成员变量.
  4. 让Activity上下文实现onClickListener接口.

所以我的问题是,你如何选择其中一种实现技术呢?根据某些条件是否有最佳实践,还是仅仅是程序员偏好的问题?

java android event-handling

6
推荐指数
1
解决办法
1433
查看次数

可能替代静态内部类以防止android/java中的内存泄漏?

最近我一直在研究java/android中的内存泄漏,几乎无处不在,它说我应该使用带有弱引用的静态内部类而不是匿名类.
所以,在我的Android应用程序中,我开始这样做,但很快就厌倦了它,因为它是很多样板代码...我认为有一个替代解决方案,我更喜欢使用,但我不确定它是在防止内存泄漏方面,静态内部类的有效替代方法.正如我之前所说,我还没有看到其他任何地方建议的解决方案(都说使用静态内部类)所以这就是为什么我不确定我的替代方案是否有效.

使用我的应用程序中的一个简单示例:
我有一个名为WebClient的类来处理异步Web请求,它接受一个名为iCallback的接口,它将响应从服务器返回给调用者,在我的活动中,一旦我得到这个回调,我需要关闭一个对话框,并可能执行一些与活动相关的事情(比如触发onBackPressed()和setResult()).
所以这是我创建的静态内部类:

private static class CallBack implements WebClient.ICallback
{
    private WeakReference<ProgressDialog> mProgDiag;
    private WeakReference<BaseActivity> mActivity;

    public CallBack(BaseActivity activity, ProgressDialog progDiag)
    {
        this.mProgDiag = new WeakReference<>(progDiag);
        this.mActivity = new WeakReference<>(activity);
    }

    @Override
    public void onCallback(String data)
    {
        String responseAsString = Utils.extractStringFromResponse(...);

        final BaseActivity parentActivity = mActivity.get();
        ProgressDialog dialog = mProgDiag.get();

        if(dialog != null)
        {
            dialog.dismiss();
        }

        if (responseAsString == null)
        {
            if(parentActivity != null)
            {
                Utils.makeServerErrorDialog(parentActivity,
                                            new iDialogButtonClickedListener()
                                            {
                                                @Override
                                                public void onDialogButtonClicked()
                                                {
                                                    parentActivity.onBackPressed();
                                                }
                                            });
            } …
Run Code Online (Sandbox Code Playgroud)

java android memory-leaks inner-classes

6
推荐指数
1
解决办法
1037
查看次数