Android Как читать актив вне основной деятельности - PullRequest
5 голосов
/ 08 ноября 2010

Мне нужно иметь возможность вызывать readAsset извне основной активности моего приложения.Я слышал, как люди упоминали о необходимости передачи контекста, но язык был очень расплывчатым.Может ли кто-нибудь описать шаги, необходимые для добавления возможности вызова readAsset к существующему классу, который не является основным видом деятельности?Создание общедоступной функции в основной деятельности и вызов других пользователей, которые не будут работать как место, куда мне нужно добавить readAsset, находятся в отдельном потоке.

Ответы [ 3 ]

8 голосов
/ 08 ноября 2010
public class NonActivity {
    public void doStuff(Context c) {
        //read from assets
        c.getAssets();
        //use assets however
    }
}

Не уверен, что вы спрашиваете, но, может быть, что-то вроде этого?Просто добавьте к существующему классу и используйте контекст для извлечения ресурсов.В своей деятельности вызовите метод, подобный этому:

public class MyActivity extends Activity {
  public void OnCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    NonActivity n = new NonActivity();
    n.doStuff(this);
  }
}
0 голосов
/ 21 апреля 2019

Чтобы прочитать активы, вам нужно Context, но вам не нужно использовать Activity в качестве Context; вместо этого вы можете использовать объект Application.

Контекст Android без активности? И другое программирование без активности?

public class MyApplication extends Application {
    private static MyApplication instance;

    public MyApplication() {
        instance = this;
    }

    public static MyApplication getInstance() {
         return instance;
    }
}

Сначала вам нужно будет добавить атрибут android:name к элементу <application> в AndroidManifest.xml:

 <application android:name="com.example.MyApplication" ... />

Теперь вы можете звонить MyApplication.getInstance().getAssets() статически из любого места.

Кроме того, вы можете использовать Dagger инъекцию зависимостей, чтобы внедрить Application непосредственно в ваш объект. (Внедрить контекст Application немного сложно. См. Dagger 2, вводящий контекст Android и , эта проблема подана в репозиторий Danger github .)

0 голосов
/ 23 июня 2017

Обратите внимание, что все обращения к файловой системе должны выполняться из основного потока, поэтому вы не должны читать их во время onCreate ().Вместо этого вы должны использовать другой поток, например, предоставляемый AysncTask.

...