我可以在 UI 线程之外使用 getFilesDir

Posted

技术标签:

【中文标题】我可以在 UI 线程之外使用 getFilesDir【英文标题】:Can i use getFilesDir outside of the UI thread 【发布时间】:2018-09-17 19:39:27 【问题描述】:

我正在使用 android Studio,我想知道应用程序在任何地方的目录(意味着每个非静态类)。

问题是,我正在创建一个名为 Constants 的类来总结我的应用程序中的任意常量。除了与应用程序目录相关的常量外,我的所有常量目前都是静态和公共的。我还实现了 Serializable 以将常量文件存储在某个文件中。我将通过 Constants 类中的静态方法导出和导入常量。真的是静态的:))

我知道 Context 类中的 getFilesDir() 不是静态的,这意味着我不能调用 MainActivity.getFilesDir().getAbsolutePath() 之类的东西,其中 MainActivity 扩展了 Activity 扩展了 Context。

我也不能这样做:

public transient static MainActivity someActivity = new MainActivity();
public transient static String parentAbsolutePath = someActivity.getFilesDir().getAbsolutePath();

因为它会在现有 UI 线程之外创建一个新的 UI 线程。

我知道有一种简单的方法可以做到这一点,那就是将 MainActivity 传递给构造函数,如下所示:

class Constants implements Serializable 
    public transient static MainActivity mainActivity;
    public transient static String parentAbsolutePath;

    Constants(MainActivity mainActivity)
        this.mainActivity = mainActivity;
        this.parentAbsolutePath = mainActivity.getFilesDir().getAbsolutePath();
    

但是,在 MainActivity 中实例化Constants constants = new Constants(this) 很麻烦,而且它缺乏模块化,其他类在不实例化对象的情况下无法使用该类。

所以我的问题是,有没有一种方法可以访问类常量中的应用程序目录,而无需传入上下文扩展对象?

【问题讨论】:

你可以使用匕首。寻找依赖注入。它会帮助你。 【参考方案1】:

简短回答:不,你不能。替代解决方法,使用 Application 类。示例:

class MyApp extends Application 
    public final Constants constants;

    public void onCreate() 
        constants = new Constants(this);
    

还有你的清单:

<application
android:name="MyApp">
<activity></activity>
</application>

【讨论】:

以上是关于我可以在 UI 线程之外使用 getFilesDir的主要内容,如果未能解决你的问题,请参考以下文章

除了主 ui 线程之外,使用 QThread 设置图形时遇到问题

在UI线程之外,多线程处理Bitmaps

在多线程中,子线程更新主线程ui都有哪些方法及注意点

检测主线程外的 UI 操作

我可以异步创建和绑定 ViewHolders 吗?

Material UI:如何在 DatePicker 之外使用 DatePickerDialog?