如何改变TextView文本从静态方法?



我在我的应用程序中有一个不断增加的值,处理程序在我的' 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);
}

这个pointsCounter方法被EventHandlerClass.java中的另一个静态方法调用。

它增加点值+5每秒,我希望它得到显示在一个TextView。正确的做法是什么?因为当我尝试这种方式时,我必须使MainActivity中的coinsTextView静态,我们都知道你不能从静态上下文中引用非静态变量。当我这样做的时候,它告诉我"不要把Android上下文类放在静态字段;这是一个内存泄漏。所以我的问题是如何从静态方法更新我的UI元素而不冒内存泄漏的风险?正确的做法是什么?

正如你所说的,永远不要在应用程序中放置静态视图或上下文,因为它会导致意外的内存泄漏,但是,如果你仍然想在应用程序中使用静态TextView,你可以在WeakReference中包装TextView:

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);
}
}

最新更新