Java中的内部类和静态嵌套类之间的主要区别是什么?设计/实施是否在选择其中一个方面发挥作用?
这种方法的优点是什么(在我的类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)
或者它不会影响性能,可以使用这两种方法吗?
在ViewHolder模式中将ViewHolder设置为静态对性能至关重要吗?
ViewHolder对象将每个组件视图存储在Layout的标记字段中,因此您可以立即访问它们而无需重复查找它们.首先,您需要创建一个类来保存您的确切视图集.例如:
static class ViewHolder {
TextView text;
TextView timestamp;
ImageView icon;
ProgressBar progress;
int position;
}
Run Code Online (Sandbox Code Playgroud) 我们知道匿名内部类可能会导致内存泄漏.但是为什么它在异步网络调用时不起作用.
例如:
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.为什么这个用于回调的匿名内部类实例不会导致活动泄漏.
我有一个activity扩展基地class称为LocationAwareActivity所有这样LocationAwareActivity activity做是创建一个位置服务客户端
LocationServices.getFusedLocationProviderClient和listens位置更新.
当活动被破坏时,它会打电话removeLocationUpdates.我发现的是
removeLocationUpdate 返回始终返回不成功的任务activity没有被垃圾收集.
- 因此,如果我启动从LocationAwareActivity该活动继承的任何活动始终保持在堆上.
所以问题是什么是停止接收位置更新的正确方法,从而允许activity垃圾收集.
可以在此处访问此项目的整个源代码 - https://github.com/snijsure/MultiActivity
我正在使用排球库进行网络服务调用.我创建了一个通用类,用于调用所有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) 我开发了一个应用程序,我想检查应用程序中发生的内存泄漏.我正在尝试使用eclipse MAT,但不成功,我正在获取HROF文件但是eclipse MAT无法读取它.任何人都可以帮助我.找到任何其他方式.
林有工作RecyclerView,SyncAdapter并greenrobot 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)
所以我需要 …
有四种方法可以将onClickListener添加到可单击的视图(例如按钮):
所以我的问题是,你如何选择其中一种实现技术呢?根据某些条件是否有最佳实践,还是仅仅是程序员偏好的问题?
最近我一直在研究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) android ×9
java ×5
memory-leaks ×3
jvm ×1
leakcanary ×1
listview ×1
okhttp ×1
performance ×1
static ×1
web-services ×1