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

3

我的应用程序里有一个值,它不断增加。实现此操作的处理程序位于我的“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中的另一个静态方法内被调用。

它每秒钟将points值增加5,我希望它能在TextView中显示出来。 正确的做法是什么? 因为如果我按照这种方式尝试,就必须将coinsTextView在MainActivity中设为静态变量。我们都知道,在静态上下文中无法引用非静态变量。 当我这样做时,它告诉我“不要将Android上下文类放置在静态字段中,这会导致内存泄漏”。 所以我的问题是,如何在静态方法中更新UI元素而不冒着内存泄漏的风险? 正确的做法是什么?

1个回答

2

正如你所说,永远不要在应用程序中放置静态的View或Context,因为这会导致意外的内存泄漏。但是如果你仍然想在应用程序中使用静态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);
    }
}

2
正是我所寻找的,一种快速简便而且安全的方式。谢谢! - HavanaSun
1
好的,它是弱的而且不泄漏。 - Shay Kin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接