我的应用程序内部有一个不断增加的值,该处理程序是在“ EventHandlerClass.java”内部的静态方法中执行的。现在,我想在MainActivity的TextView上显示此值。
这是我的处理程序的静态方法:
public static void pointsCounter() {
handler = new Handler(Looper.getMainLooper());
runnable = new Runnable() {
public void run() {
points = points + 5;
String pointMsg = "Points: " + points;
MainActivity.coinsTextView.setText(pointMsg);
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runnable, 1000);
}
从EventHandlerClass.java内部的另一个静态方法中调用了pointsCounter方法。
它每秒增加点值+5,我希望它显示在TextView中。正确的做法是什么?因为当我以这种方式尝试时,必须使MainActivity中的coinTextView成为静态,所以我们都知道您不能从静态上下文中引用非静态变量。当我这样做时,它告诉我“请勿将Android上下文类放在静态字段中;这是内存泄漏”。所以我的问题是如何从静态方法更新UI元素而又不会冒内存泄漏的危险?正确的做法是什么?
正如您所说的“从不在应用程序中放置静态视图或上下文”,因为它会引起异常的内存泄漏,但是,如果您仍然想在应用程序中使用静态TextView,则可以将TextView包装在WeakReference中:
WeakReference:弱引用是指不足以将对象保留在内存中的引用。如果我们尝试确定是否强烈引用了该对象,而该对象恰好是通过WeakReferences进行的,则该对象将被垃圾回收。这个例子如何使用它:
public class MainActivity extends AppCompatActivity {
private static WeakReference<TextView> viewWeakReference;
private static Handler handler;
private static int points;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textV);
viewWeakReference = new WeakReference<>(textView);
pointsCounter();
}
public static void pointsCounter() {
handler = new Handler(Looper.getMainLooper());
Runnable runnable = new Runnable() {
public void run() {
points = points + 5;
String pointMsg = "Points: " + points;
viewWeakReference.get().setText(pointMsg);
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runnable, 1000);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句