如何在doInBackground中传递上下文?

时间:2019-07-28 10:51:50

标签: java android service android-asynctask

所以,我在Android应用程序中做了一些繁重的工作。我将一些字节写入文件。但问题是,如果我在主线程上执行此操作,则应用程序将崩溃,因为有时字节数组的长度非常大。因此,我决定在异步任务中将字节写入文件功能。问题是要做到这一点,我需要一个上下文,并且您无法在异步任务的doInBackground()中访问上下文。我的编码在这里是无关紧要的,因为我的问题是我需要我的应用程序或活动的上下文不为null,并且可以通过doInBackground()方法进行访问。我读过一篇有关如何提供服务的文章,但我真的不明白。

例如,我的字节数组长度为5234400字节。将其转换为文件需要大量内存,因此最好在另一个线程中执行。而且,我不使用压缩功能,因为它们大多数都是无用的。

我说这不是重复的。我想将上下文传递给 resultNumber = new Intl.NumberFormat('en-IN', { maximumSignificantDigits: 3 }).format(yourNumber); 方法。

  

我的问题:是否可以在doInBackground()函数中访问上下文?或者,如果没有,那么如何单击按钮才能使用服务,而不是一直打开它。以及服务如何工作以及如何设置?

     

第二个(次要)问题:是否有一种压缩字节的方法,所以长度不是那么大吗?

对于那些想要代码的人来说就是这样:

doInBackground()

1 个答案:

答案 0 :(得分:2)

一种方法可以使用服务,但是它需要创建服务,创建代码以同步服务和活动之间的通信等等。

完成任务的快速方法是使用作为Context子级的Application实例。为此,在Application类中,定义对创建应用程序时创建的实例的静态引用。假设SampleApplication是您的应用程序类名称:

public class SampleApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        instance=this;

        ...
    }

    public static SampleApplication getInstance() {
        return instance;
    }

    private static instance;
}

因此,在后台任务中,只需使用SampleApplication.getInstance()就可以轻松使用Application上下文。

最好不要在后台任务中使用ActivityFragment作为上下文,因为如果在任务期间破坏了活动/片段,它们可能会失效。