gpt4 book ai didi

Android 处理程序更改 WeakReference

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:22 26 4
gpt4 key购买 nike

我的静态处理程序对我的 Activity 有一个 WeakReference(这是为了防止记录良好的内存泄漏问题)。

我发布了一条延迟很长时间的消息,我希望将此消息传送到我的 Activity (应该在前台)。

我担心的是,在方向改变时,我的 Activity 被销毁,处理程序引用了应该被销毁的旧 Activity。

为了在我的 Activity 的 onCreate 中解决这个问题,我这样做了。

    if(mHandler == null)
mHandler = new LoginHandler(this);
else {
mHandler.setTarget(this);
}

我的处理程序被声明为静态全局变量:

private static LoginHandler     mHandler            = null;

并且实现类也是静态的,如下所示:

private static class LoginHandler extends Handler {

private WeakReference<LoginActivity> mTarget;

LoginHandler(LoginActivity target) {
mTarget = new WeakReference<LoginActivity>(target);
}

public void setTarget(LoginActivity target) {
mTarget = new WeakReference<LoginActivity>(target);
}

@Override
public void handleMessage(Message msg) {
// process incoming messages here
LoginActivity activity = mTarget.get();
switch (msg.what) {
case Constants.SUCCESS:
activity.doSomething();
break;

default:
activity.setStatusMessage("failed " + msg.obj, STATUS_TYPE_DONE);
}
}
}

我想知道的是,在 onCreate 上更改 WeakReference 是否有问题,或者这种方法是否还有其他问题?

谢谢,

最佳答案

所以我写了下面的测试来弄清楚我的想法是否正确,看起来我的方法是正确的。在 onCreate 中,我们更改了 WeakReference 并且发布的消息将始终传递到前台的 Activity 。如果您将此代码更改为始终在 onCreate 中创建一个新的处理程序,您会注意到更新消息不会被传递。

public class MainActivity extends Activity {

private static int COUNT = 0;

static LoginHandler mHandler;

private static class LoginHandler extends Handler {

private WeakReference<MainActivity> mTarget;

LoginHandler(MainActivity target) {
mTarget = new WeakReference<MainActivity>(target);
}

public void setTarget(MainActivity target) {
mTarget.clear();
mTarget = new WeakReference<MainActivity>(target);
}

@Override
public void handleMessage(Message msg) {
// int duration = Toast.LENGTH_LONG;
// process incoming messages here
MainActivity activity = mTarget.get();
activity.update(msg.arg1);
}
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

if(mHandler == null)
mHandler = new LoginHandler(this);
else
mHandler.setTarget(this);

((Button)findViewById(R.id.button)).setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
Message msg = new Message();
msg.arg1 = COUNT++;
mHandler.sendMessageDelayed(msg, 3000);

}
});

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

private void update(int count) {
((TextView) findViewById(R.id.hello_world)).setText("Hello World @ "+ count);
}

}

关于Android 处理程序更改 WeakReference,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18221593/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com