public abstract class

BaseDataSource

extends java.lang.Object

implements DataSource

 java.lang.Object

↳androidx.media3.datasource.BaseDataSource

Subclasses:

ContentDataSource, ByteArrayDataSource, RawResourceDataSource, FileDataSource, DefaultHttpDataSource, DataSchemeDataSource, UdpDataSource, AssetDataSource, RtmpDataSource, CronetDataSource, OkHttpDataSource, FakeDataSource

Gradle dependencies

compile group: 'androidx.media3', name: 'media3-datasource', version: '1.0.0-alpha03'

  • groupId: androidx.media3
  • artifactId: media3-datasource
  • version: 1.0.0-alpha03

Artifact androidx.media3:media3-datasource:1.0.0-alpha03 it located at Google repository (https://maven.google.com/)

Overview

Base DataSource implementation to keep a list of TransferListeners.

Subclasses must call BaseDataSource.transferInitializing(DataSpec), BaseDataSource.transferStarted(DataSpec), BaseDataSource.bytesTransferred(int), and BaseDataSource.transferEnded() to inform listeners of data transfers.

Summary

Constructors
protectedBaseDataSource(boolean isNetwork)

Creates base data source.

Methods
public final voidaddTransferListener(TransferListener transferListener)

protected final voidbytesTransferred(int bytesTransferred)

Notifies listeners that bytes were transferred.

protected final voidtransferEnded()

Notifies listeners that a transfer ended.

protected final voidtransferInitializing(DataSpec dataSpec)

Notifies listeners that data transfer for the specified DataSpec is being initialized.

protected final voidtransferStarted(DataSpec dataSpec)

Notifies listeners that data transfer for the specified DataSpec started.

from java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructors

protected BaseDataSource(boolean isNetwork)

Creates base data source.

Parameters:

isNetwork: Whether the data source loads data through a network.

Methods

public final void addTransferListener(TransferListener transferListener)

protected final void transferInitializing(DataSpec dataSpec)

Notifies listeners that data transfer for the specified DataSpec is being initialized.

Parameters:

dataSpec: DataSpec describing the data for initializing transfer.

protected final void transferStarted(DataSpec dataSpec)

Notifies listeners that data transfer for the specified DataSpec started.

Parameters:

dataSpec: DataSpec describing the data being transferred.

protected final void bytesTransferred(int bytesTransferred)

Notifies listeners that bytes were transferred.

Parameters:

bytesTransferred: The number of bytes transferred since the previous call to this method (or if the first call, since the transfer was started).

protected final void transferEnded()

Notifies listeners that a transfer ended.

Source

/*
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package androidx.media3.datasource;

import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.common.util.Util.castNonNull;

import androidx.annotation.Nullable;
import androidx.media3.common.util.UnstableApi;
import java.util.ArrayList;

/**
 * Base {@link DataSource} implementation to keep a list of {@link TransferListener}s.
 *
 * <p>Subclasses must call {@link #transferInitializing(DataSpec)}, {@link
 * #transferStarted(DataSpec)}, {@link #bytesTransferred(int)}, and {@link #transferEnded()} to
 * inform listeners of data transfers.
 */
@UnstableApi
public abstract class BaseDataSource implements DataSource {

  private final boolean isNetwork;
  private final ArrayList<TransferListener> listeners;

  private int listenerCount;
  @Nullable private DataSpec dataSpec;

  /**
   * Creates base data source.
   *
   * @param isNetwork Whether the data source loads data through a network.
   */
  protected BaseDataSource(boolean isNetwork) {
    this.isNetwork = isNetwork;
    this.listeners = new ArrayList<>(/* initialCapacity= */ 1);
  }

  @Override
  public final void addTransferListener(TransferListener transferListener) {
    checkNotNull(transferListener);
    if (!listeners.contains(transferListener)) {
      listeners.add(transferListener);
      listenerCount++;
    }
  }

  /**
   * Notifies listeners that data transfer for the specified {@link DataSpec} is being initialized.
   *
   * @param dataSpec {@link DataSpec} describing the data for initializing transfer.
   */
  protected final void transferInitializing(DataSpec dataSpec) {
    for (int i = 0; i < listenerCount; i++) {
      listeners.get(i).onTransferInitializing(/* source= */ this, dataSpec, isNetwork);
    }
  }

  /**
   * Notifies listeners that data transfer for the specified {@link DataSpec} started.
   *
   * @param dataSpec {@link DataSpec} describing the data being transferred.
   */
  protected final void transferStarted(DataSpec dataSpec) {
    this.dataSpec = dataSpec;
    for (int i = 0; i < listenerCount; i++) {
      listeners.get(i).onTransferStart(/* source= */ this, dataSpec, isNetwork);
    }
  }

  /**
   * Notifies listeners that bytes were transferred.
   *
   * @param bytesTransferred The number of bytes transferred since the previous call to this method
   *     (or if the first call, since the transfer was started).
   */
  protected final void bytesTransferred(int bytesTransferred) {
    DataSpec dataSpec = castNonNull(this.dataSpec);
    for (int i = 0; i < listenerCount; i++) {
      listeners
          .get(i)
          .onBytesTransferred(/* source= */ this, dataSpec, isNetwork, bytesTransferred);
    }
  }

  /** Notifies listeners that a transfer ended. */
  protected final void transferEnded() {
    DataSpec dataSpec = castNonNull(this.dataSpec);
    for (int i = 0; i < listenerCount; i++) {
      listeners.get(i).onTransferEnd(/* source= */ this, dataSpec, isNetwork);
    }
    this.dataSpec = null;
  }
}