Реализация распаковать после загрузки
Здравствуйте, мне удалось скачать файл. И теперь я использую класс из
http://www.jondev.net/articles/Unzipping_Files_with_Android_%28Programmatically%29
Итак, я хотел бы получить совет относительно того, где я должен реализовать этот класс. А также есть ли способ удалить ZIP-файл после распаковки? Спасибо.
Это мой основной код
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.xml);
btn_src = (Button) findViewById(R.id.source);
btn_src.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
String link;
link = resurl + "9_1342080926-1.0.zip";
downloadRes = new downloadRes();
downloadRes.execute(link);
}
});
String zipFile = Environment.getExternalStorageDirectory() +
"/aiyo/aiyomag/edition/9_1342080926-1.0.zip";
String unzipLocation = Environment.getExternalStorageDirectory() +
"/aiyo/aiyomag/edition/sourcetest";
Decompress d = new Decompress(zipFile, unzipLocation);
d.unzip();
Это правильный путь для меня, чтобы осуществить процесс расстегивания молнии?
Я действительно новичок в Android. Любая помощь будет оценена.
РЕДАКТИРОВАТЬ - UNZIP В ASYNCTASK
public class downloadRes extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showDialog(DIALOG_DOWNLOAD_PROGRESS);
}
@Override
protected String doInBackground(String... params) {
try {
File root = android.os.Environment
.getExternalStorageDirectory();
File dir = new File(root.getAbsolutePath() + "/aiyo/aiyomag/edition/sourcetest");
if (dir.exists() == false) {
dir.mkdirs();
}
Log.d("param", params[0]);
URL url = new URL(params[0]); // you can write here any link
URLConnection connection = url.openConnection();
connection.connect();
// get file name and file extension
String fileExtenstion = MimeTypeMap
.getFileExtensionFromUrl(params[0]);
String name = URLUtil.guessFileName(params[0], null,
fileExtenstion);
File file = new File(dir, name);
Log.d("File in content","The file is "+file.getName());
/*
* Define InputStreams to read from the URLConnection.
*/
InputStream is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
OutputStream fos = new FileOutputStream(file);
/*
* Read bytes to the Buffer until there is nothing more to
* read(-1).
*/
int lenghtOfFile = connection.getContentLength();
int total = 0;
byte baf[] = new byte[1024];
int current = 0;
while ((current = bis.read(baf)) != -1) {
total += current;
// publishProgress("" + (int) ((total * 100) /
// lenghtOfFile));
mProgressDialog.setProgress(((total * 100) / lenghtOfFile));
fos.write(baf, 0, current);
}
// close every file stream
fos.flush();
fos.close();
is.close();
} catch (IOException e) {
Log.e("DownloadManager", "Error: " + e);
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
mProgressDialog.setProgress(Integer.parseInt(values[0]));
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
// if (fileInteger == max) {
// dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
// return;
// }
Log.d("post execute", "i::" + fileInteger);
// fileInteger++;
// publishProgress("" + (int) ((fileInteger * 100) / max));
// mProgressDialog.setSecondaryProgress(((fileInteger * 100) / max));
String link = resurl+"9_1342080926-1.0.zip";
downloadRes = new downloadRes();
downloadRes.execute(link);
}
}
Это просто класс, однако. И я до сих пор называю это в onCreate.
2 ответа
Я предлагаю вам выполнить загрузку и распаковку в AsyncTask. Это хорошая практика, позволяющая избежать замораживания вашей активности или графического интерфейса, если процесс занимает некоторое время. Начиная с ICS (или, возможно, ранее), вы не можете выполнять веб-запросы в коде Activity, и асинхронный подход становится обязательным. Если вы этого не сделаете, веб-запрос или загрузка не удастся.
РЕДАКТИРОВАТЬ: Это может быть полезно ссылка учебник.
Некоторый код псевдо, чтобы повторить то, что было получено:
onCreate()
{
buttonOnClick
{
DownloadAndUnzip.execute(the url)
}
}
inner class DownloadAndUnzip()
{
boolean failed;
preExecute()
{
failed = false;
}
doInBackground()
{
try
{
start download stream
}
catch
{
failed = true
}
finally
{
close streams
}
if failed == false
{
try
{
decompress(zip file)
}
catch
{
failed = true
}
finally
{
close streams
}
}
}
postExecute()
{
if failed
{
download failed
notify user
}
else
{
download and unzip is good
zip.delete
}
}
}