Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Using this, when decompressing a file around 800mb on my nexus 7, the app slows down badly. *SOLUTION: Use asynctask*
//Called on a button click in my Main activity file
public MainActivity instance;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = getInstance();
//rest of code...
}
public MainActivity getInstance() {
if (instance == null) {
instance = this;
}
return instance;
}
try {
new ZipTool(instance).decompress();
} catch (IOException e) {
e.printStackTrace();
}
import android.util.Log;
import com.appsbytravis.acmusic.MainActivity;
import com.snatik.storage.Storage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Locale;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipTool {
private final MainActivity instance;
private int prepareAssetsProgress = 0;
private static final int BUFFER_SIZE = 1024;
private Storage storage;
private String path;
private static final String ASSET_FILE = "/music_assets.zip";
private static final String ASSETS_PATH = "/assets/";
public ZipTool(MainActivity instance) {
this.instance = instance;
storage = new Storage(instance);
path = storage.getInternalFilesDirectory();
}
public void decompress() throws IOException {
File file = storage.getFile(path.concat(ASSET_FILE));
FileInputStream fis = new FileInputStream(file.getPath());
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
byte[] bytesIn = new byte[BUFFER_SIZE];
while ((entry = zis.getNextEntry()) != null) {
if (instance.isPreparing) {
String filePath = path.concat(ASSETS_PATH).concat(entry.getName());
long size = entry.getSize();
if (!entry.isDirectory()) {
Log.d(instance.TAG, entry.getName());
FileOutputStream fos = new FileOutputStream(filePath);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int read;
while ((read = zis.read(bytesIn)) != -1) {
bos.write(bytesIn, 0, read);
prepareAssetsProgress += bytesIn.length;
instance.bar.setProgress((int) (prepareAssetsProgress / size));
instance.progressTextView.setText(String.format(Locale.US, "%d%%", (int) (prepareAssetsProgress / size)));
}
fos.close();
} else {
Log.d(instance.TAG, entry.getName());
storage.createDirectory(filePath);
}
zis.closeEntry();
} else {
break;
}
}
zis.close();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment