我希望使用WeakReference方法来避免AsyncTask泄漏内存。我在网上和Stackoverflow上找到了一些例子,但是它们只获得了onPostExecute中的引用,我不知道如何在所有三个UI方法中正确地使用它。我目前的方法是这样的,但我不知道我是否能摆脱一些冗余。为什么我不能在构造函数中调用activityReference.get(),然后在每个UI方法中只检查null?为什么在线示例在使用get之前直接调用WeakReference?
private static class ExampleAsyncTask extends AsyncTask<Integer, In
我尝试将文件加载到服务器。我需要等待,直到所有的操作都完成后,才能启动其他方法。所以我使用同步调用。我尝试在启动新线程之前显示ProgressDialog,但是,虽然所有线程都没有完成,但我的UI线程只是卡住了。
private void uploadImageSync() {
final ProgressDialog progressDialog;
progressDialog = new ProgressDialog(BarcodActivity.this);
progressDialog.setMessage("Load...");
pro
我正在尝试从我的远程服务器获取数据,尝试在SQLite中创建数据库,并更新我的共享首选项。我将前面提到的所有操作都放在一个AsyncTask中,理论上它必须在UI (主线程)以外的单独线程上运行。此外,我在实际的Android设备上运行该应用程序,而不是在仿真器上运行。 我在日志中获得了以下信息: I/Choreographer: Skipped 229 frames! The application may be doing too much work on its main thread. 源代码: import android.annotation.SuppressLint;
imp
我有一个类,每次只有一个实例。它本质上是一个单例,在不保存外部引用时被销毁,在以后需要一个新引用时重新实例化。
private static readonly WeakReference<Foo> weakInstance = new WeakReference<Foo>(null);
上面代码的原因是我有本机iOS回调(必须是静态函数),但需要将数据传递给当前实例。
tl;博士将WeakReference初始化为null并在以后设置目标安全吗?这是暗号味吗?
编辑:正如@smolchanovsky所指出的那样,我可以在需要设置弱引用时实例化弱引用。这导致:
if (w
progressDialog of my AsyncTask没有出现。它看起来是正确的,但它没有显示对话框。内部的操作工作得很好,但似乎忽略了onPreExecute()和onPostExecute()方法。
private class copyApk extends AsyncTask<Void, Void, Void> {
int appPosition;
ProgressDialog mProgressDialog = new ProgressDialog(getActivity());
@Override
protected void
在一个程序中,我需要在某个存储引擎(实际上是嵌入式Prolog数据库)中存储弱引用。为了使解释保持简单,这样的存储引擎可以被看作是弱引用的集合(在这个问题的上下文中)。
我需要保证,当引用被回收时,弱引用就会从存储引擎中被收回。换句话说,如果引擎的get()方法已经返回null,则不应该能够访问该引擎的弱引用。
我目前通过ReferenceQueue实现了这一点。
以下代码通过添加cleanUp()方法扩展弱引用(该方法调用从引擎删除弱引用的清理任务):
public class MyWeakRef<REF_TYPE> extends WeakReference<REF_TY
最近,我重构了一些C#代码,发现出现了一些双重检查的锁定实践。我当时并不知道这是一种糟糕的做法,我真的很想摆脱它。
问题是我有一个类,它应该被懒惰地初始化,并且经常被许多线程访问。我也不想将初始化移到静态初始化器,因为我计划使用弱引用来防止初始化对象在内存中停留太长时间。然而,如果需要的话,我想要“复活”对象,以确保以线程安全的方式实现。
我想知道在C#中使用ReaderWriterLockSlim并在第一次检查之前输入UpgradeableReadLock,然后在必要时输入用于初始化的写锁定是否是一个可接受的解决方案。下面是我的想法:
public class LazyInitialized
快速问题:可以创建一个类,比如它包含一个内部无限线程(心跳),并且它的对象自动被垃圾收集?
长问题:,我打算创建一个包含内部无限背景线程(例如心跳)的类。尽管这个类的对象不需要显式销毁,并且在不再引用时(此时也应该销毁心跳时)将被垃圾收集,但类似的C#。
问题是: Java不会垃圾收集这些对象,因为它们内部包含一个正在运行的线程。这导致了一个imortal对象。
示例:
示例C#代码(按预期工作):
using System;
using System.Threading;
namespace HeartbeatTest
{
class Program
{
s
我发现了以下代码,如何在Java中清除线程的ThreadLocals:
private void cleanThreadLocals() {
try {
// Get a reference to the thread locals table of the current thread
Thread thread = Thread.currentThread();
Field threadLocalsField = Thread.class.getDeclaredField("threadLocals");
下面是一个简单的例子:
class MyClass : IDisposable
{
bool working;
public MyClass()
{
working = true;
Thread t = new Thread(Worker);
t.Start();
}
void Worker()
{
while(working)
{}
}
public void Dispose()
{
working = false;
当使用后台线程进行工作时,通常需要通过Handler更新UI。
这样做的一种方法是在类级别定义一个处理程序,如和中所概述的那样。
final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//update UI or call class methods here
}
};
但是,此构造将导致以下警告
Handler class should be static otherwise memory leaks might occur
另一种方法是使用和中概
我的应用程序记录某些对象的使用情况-我的设置使用AspectJ来识别我感兴趣的上下文,并记录这些使用情况。我稍后加载日志文件进行分析,但是出于效率的原因,知道对象何时不再可达是很有用的。
我目前的方法是使用“垃圾记录器”记录我感兴趣的对象,然后创建一个包含该对象的身份散列代码的“saver”对象,并将其存储在一个弱散列映射中。其思想是,当对象被收集时,将从弱散列映射中移除保护程序对象并将其收集,从而运行代码来记录所收集对象的身份散列代码。我使用单独的线程和队列来防止在垃圾收集器中造成瓶颈。下面是垃圾记录器的代码:
public class GarbageLogger extends Threa
我很难避免出现"Unable to add window - token android.os.BinderProxy is is;your activity running?“的问题。在将进度对话框与异步任务一起使用时发生异常。 final ProgressDialog nDialog = new ProgressDialog(MainActivity.this);
nDialog.setMessage("Loading...");
nDialog.setIndeterminate(false);
nDialog.setCancelable(
我有以下代码。
//This is global for the activity.
Handler handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
//update the UI
}
};
在我的onResume()中,我启动了一个运行可运行线程的新线程。
protected void onResume()
{
super.onResume();
Thread t = new Thread(runnab
我在做一台editText和一台recyclerView当我在我的EditText中写信时,我的recyclerView就会更新。
我在我的textWatcher中放了一个计时器,以避免用户每次写信时都发送请求。
searchDestinationEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(final CharSequence s, final int start, final int count, final int after) {
我实现了一个Object缓存,如下所示:
// Dictionary with weak keys & values
private Map<Object, WeakReference<Object>> cache = new WeakHashMap<>();
private Object checkCache(Object obj) {
// If it's in the cache, returned the cached copy.
if (cache.containsKey(obj)) return cache.g
如何使用android和java在地图上按街道名称显示位置?
例如:我将输入我的程序街道,城市-我在地图上得到位置
我有这个样本:
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("geo:31.06221,33.781642"));
startActivity(i);
如何更改此代码以插入街道和城市?我试试这个:
类似于:Uri.parse("geo:empire state building"));
但它不起作用):
我将在这个问题的开头声明,我是Java垃圾收集的新手,所以如果收集器解决了这个问题,我会很高兴的。或者,如果我对Java内存分配一无所知(事实上我就是这样),我道歉。但是,我正在考虑以下三种情况:
public class ScenarioA implements MyQuestion{
private Field field;
public Field getField(){
if(field == null){
field = new Field(this);
}
return field;
}
与
我有下面的代码,可以很好地通过id在Room数据库中查找和读取记录。Android Studio需要添加一个try/catch代码块,我已经将其包含在下面。 两个问题:如果没有异常,我可以在onPostExecute()中将if{}部分留空吗? 如何通过WeakReference在不泄漏内容和不使用hack的情况下显示AlertDialog? // AsyncTask for reading an existing CardView from the database.
private static class ReadAsyncTask extends AsyncTask<Integ