Was ist die Verwendung von MemoryFile in Android

Lesezeit: 3 Minuten

Was ist die Verwendung von MemoryFile in Android
nits.kk

Ich möchte einige Bytes in einen gemeinsamen Speicher schreiben. Dies geschieht in meiner Anwendung1. Von meiner anderen Anwendung: Anwendung2 möchte ich auf diesen gemeinsam genutzten Speicher zugreifen, um die geschriebenen Bytes zu lesen. Zu diesem Zweck habe ich versucht, die MemoryFile-Klasse von Android zu verwenden. Ich weiß nicht, wie ich zwischen zwei verschiedenen Anwendungen auf denselben Shard-Speicher verweisen soll. Ich bin jetzt auch verwirrt, ob memoryFile für denselben Zweck verwendet wird oder nicht.
http://developer.android.com/reference/android/os/MemoryFile.html diesen Link habe ich zum Thema gefunden. Vielen Dank im Voraus. Krishna

  • Ich denke, der “offizielle” Weg besteht darin, einen Inhaltsanbieter zu verwenden oder eine normale Datei auf einem externen Speicher zu verwenden.

    – Herr Schmidt

    17. November 2011 um 10:09 Uhr

  • +1 für ContentProvider / ContentResolver

    – Guillaume

    17. November 2011 um 10:16 Uhr

  • Die Größe des Inhalts ist groß (3-4 MB) und ich brauche schnelles Lesen und Schreiben, also brauche ich so etwas wie Shared Memory. Bitte auch, wenn Sie mir helfen könnten, die Verwendung von memoryFile in Android zu verstehen.

    – nits.kk

    17. November 2011 um 11:50 Uhr

  • Die offizielle API für MemoryFile ist ziemlich vollständig scheiße (wie gewöhnlich) – sind aber versteckt #getParcelFileDescriptor() (was gut zwischen Prozessen übertragen wird) und #getFileDescriptor().

    – Jens

    17. November 2011 um 11:54 Uhr

Wenn Sie eine prozessübergreifende Verwendung mit wünschen MemoryFile Sie können Folgendes verwenden flüchtig Methode:

import android.os.MemoryFile;
import android.os.ParcelFileDescriptor;

import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MemoryFileUtil {
    private static final Method sMethodGetParcelFileDescriptor;
    private static final Method sMethodGetFileDescriptor;
    static {
        sMethodGetParcelFileDescriptor = get("getParcelFileDescriptor");
        sMethodGetFileDescriptor = get("getFileDescriptor");
    }

    public static ParcelFileDescriptor getParcelFileDescriptor(MemoryFile file) {
        try {
            return (ParcelFileDescriptor) sMethodGetParcelFileDescriptor.invoke(file);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    public static FileDescriptor getFileDescriptor(MemoryFile file) {
        try {
            return (FileDescriptor) sMethodGetFileDescriptor.invoke(file);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    private static Method get(String name) {
        try {
            return MemoryFile.class.getDeclaredMethod(name);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}

Was Sie sich ansehen sollten, ist die #getParcelFileDescriptor(MemoryFile) -Methode, die Sie von einer Implementierung von zurückgeben können ContentProvider#openFile(Uri, String).

  • Ich vermute, mein Code löst eine Ausnahme bei MemoryFile.class.getDeclaredMethod(“getParcelFileDescriptor”); aber es geht nicht wirklich um eine Fangklausel, die ich erst kannte, nachdem ich dort einen Haltepunkt gesetzt hatte

    – Duckduckgo

    22. September 2013 um 11:49 Uhr

  • Ich verstehe es wirklich nicht. Wenn Sie nur einen FD bestehen, warum sollten Sie dann überhaupt Ashem verwenden? Sie können einfach ParcelFileDescriptor.createPipe() verwenden und alle gewünschten lokalen Daten darüber schreiben. Kein Ashem erforderlich.

    – Jeffrey Blattmann

    11. Oktober 2016 um 18:22 Uhr

Ich vermute, dass Speicherdateien die getParcelFileDescriptor-Methode nicht haben. Als ich diese getParcelFileDescriptor-bezogenen Methoden kommentierte und getFileDescriptor verwende. Es hat gut funktioniert.

import java.io.FileDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.os.MemoryFile;

/**
 * Invoke hidden methods using reflection
 * 
 */
public class MemoryFileUtil {
    private static final Method sMethodGetFileDescriptor;
    static {
        sMethodGetFileDescriptor = get("getFileDescriptor");
    }

    public static FileDescriptor getFileDescriptor(MemoryFile file) {
        try {
            return (FileDescriptor) sMethodGetFileDescriptor.invoke(file);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (InvocationTargetException e) {
            throw new RuntimeException(e);
        }
    }

    private static Method get(String name) {
        try {
            return MemoryFile.class.getDeclaredMethod(name);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }
}

Und Dateideskriptor aus Speicherdatei erstellt.

FileDescriptor fd = MemoryFileUtil.getFileDescriptor(memFile);

1647159186 881 Was ist die Verwendung von MemoryFile in Android
uns_david

MemoryFile kann verwendet werden, um dem physischen Speicher zuzuordnen. Der Ergebnisdateideskriptor (fd) kann an den Client (Seite mit gemeinsamer Speichernutzung) weitergegeben werden. Der Client kann dieselbe native fd derselben Speicherregion zuordnen. Der Speicher kann dann mit dem nativen fd geteilt werden, das mit InputStream auf Java-Layer abgebildet werden kann.

Weitere Informationen finden Sie unter diesem Link:
Speicher mit Ashem teilen.

996580cookie-checkWas ist die Verwendung von MemoryFile in Android

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy