Страница 1 из 1

Загрузка фалов из интернета

Добавлено: 06 авг 2014, 19:29
vit9376
Здравствуйте, помогите пожалуйста. Есть во этот код:

Код: Выделить всё

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {
    
	public static final String] Urls = {
		"https://www.url1",
		//"https://www.url2",
		//"https://www.url3"
	};

	
    TextView textView;
    ProgressDialog progressDialog;
    DownloadTask downloadTask;
    

    public static  void createDir(String folder) {
        File f1 = new File(folder); 
        if (!f1.exists()) {
                f1.mkdirs(); 
        }
}
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textView = (TextView)findViewById(R.id.textView);
   
                
       
        
        downloadTask = new DownloadTask();     
        downloadTask.execute(Urls);
       
    }
    

    
    @Override
    protected void onStop() {
        downloadTask.cancel(true);
        super.onStop();
    }
    
   
    class DownloadTask extends AsyncTask<String, Integer, Drawable>{
        
        @Override
        protected void onPreExecute() {
           
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setIndeterminate(false);
            progressDialog.setMax(100);
            progressDialog.setProgress(0);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMessage("Загрузка");
            progressDialog.show();
          
        }
       
        @Override
        protected Drawable doInBackground(String... params) {
           
            int count;
            try {
                URL url = new URL(params[0]);
                URLConnection conection = url.openConnection();
                conection.connect();
                int lenghtOfFile = conection.getContentLength();
                InputStream input = new BufferedInputStream(url.openStream(), 8192);
                OutputStream output = new FileOutputStream("/sdcard/testfile.html");
                byte data] = new byte[50];     
                long total = 0;
     
                while ((count = input.read(data)) != -1) {
                    
                   
                    if (isCancelled()){
                        return null;
                    }
                    total += count;  
                    output.write(data, 0, count);
                    
                   
                    publishProgress((int)((total*100)/lenghtOfFile));
                }
                output.flush(); 
                output.close();
                input.close();
     
            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
     
            String imagePath = Environment.getExternalStorageDirectory().toString() + "/testfile.html";
            return Drawable.createFromPath(imagePath);
        }
        
        @Override
        protected void onProgressUpdate(Integer... progress) {
            progressDialog.setProgress(progress[0]);
        }
        
             
        @Override
        protected void onCancelled() {

        }
    }

    
   

    }
при этом загружается 1 файл. Вопрос в том, что я не могу понять как сделать загрузку например 30 файлов?

Re: Загрузка фалов из интернета

Добавлено: 06 авг 2014, 19:49
altwin
vit9376 писал(а):Здравствуйте, помогите пожалуйста. Есть во этот код:

Код: Выделить всё

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.TextView;

public class MainActivity extends Activity {
    
	public static final String] Urls = {
		"https://www.url1",
		//"https://www.url2",
		//"https://www.url3"
	};

	
    TextView textView;
    ProgressDialog progressDialog;
    DownloadTask downloadTask;
    

    public static  void createDir(String folder) {
        File f1 = new File(folder); 
        if (!f1.exists()) {
                f1.mkdirs(); 
        }
}
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textView = (TextView)findViewById(R.id.textView);
   
                
       
        
        downloadTask = new DownloadTask();     
        downloadTask.execute(Urls);
       
    }
    

    
    @Override
    protected void onStop() {
        downloadTask.cancel(true);
        super.onStop();
    }
    
   
    class DownloadTask extends AsyncTask<String, Integer, Drawable>{
        
        @Override
        protected void onPreExecute() {
           
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setIndeterminate(false);
            progressDialog.setMax(100);
            progressDialog.setProgress(0);
            progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressDialog.setMessage("Загрузка");
            progressDialog.show();
          
        }
       
        @Override
        protected Drawable doInBackground(String... params) {
           
            int count;
            try {
                URL url = new URL(params[0]);
                URLConnection conection = url.openConnection();
                conection.connect();
                int lenghtOfFile = conection.getContentLength();
                InputStream input = new BufferedInputStream(url.openStream(), 8192);
                OutputStream output = new FileOutputStream("/sdcard/testfile.html");
                byte data] = new byte[50];     
                long total = 0;
     
                while ((count = input.read(data)) != -1) {
                    
                   
                    if (isCancelled()){
                        return null;
                    }
                    total += count;  
                    output.write(data, 0, count);
                    
                   
                    publishProgress((int)((total*100)/lenghtOfFile));
                }
                output.flush(); 
                output.close();
                input.close();
     
            } catch (Exception e) {
                Log.e("Error: ", e.getMessage());
            }
     
            String imagePath = Environment.getExternalStorageDirectory().toString() + "/testfile.html";
            return Drawable.createFromPath(imagePath);
        }
        
        @Override
        protected void onProgressUpdate(Integer... progress) {
            progressDialog.setProgress(progress[0]);
        }
        
             
        @Override
        protected void onCancelled() {

        }
    }

    
   

    }
при этом загружается 1 файл. Вопрос в том, что я не могу понять как сделать загрузку например 30 файлов?
public static final String] Urls - это что?
String imagePath = Environment.getExternalStorageDirectory().toString() + "/testfile.html"; повторить это действие 30 раз каждый раз меняя название файла, в том числе тут: OutputStream output = new FileOutputStream("/sdcard/testfile.html");
Когда сделаете и возникнет необходимость загрузить 1 000 000 файлов, подумайте зачем нужны массивы/списки строк, циклы, очереди запросов и т.д. Но лучше разберитесь в том, что тут происходит я никогда не поверю, что вы написали все это самостоятельно и не знаете, как вместо "/testfile.html" - использовать переменные или списки/массивы... Вывод - не надо просто так копировать что -то я уже сотню раз повторял на этом форуме - забудьте вы про eclipse/idea и т.д. забудьте про android, учите основы программирования и основы java, пишите код в тектовом редакторе и собирайте руками.. автодополнение кода и другие "плюшки" ide ваши злейшие враги сейчас и если таким макаром вы чему то и научитесь, то пройдет очень много лет...

P.S. лучше конечно для начала писать код на бумажке, но вам ведь нужен быстрый результат, а не качественный...

P.S.v.2. http://stackoverflow.com/a/14085378 но лучше для начала почитать к примеру тут: http://codingbat.com/doc/java-array-loops.html

А вообще некоторые предлагают такой тест готовности... ведь не стоит браться за что -то не зная основ правда? Так вот не беритесь за android пока не реализуете работу вот этого простого алгоритма через рекурсию...
[syntax=java5]
public class Search {
public static boolean contains(int[] a, int b) {
if (a.length == 0) {
return false;
}
int low = 0;
int high = a.length-1;

while(low <= high) {
int middle = (low+high) /2;
if (b> a[middle]){
low = middle +1;
} else if (b< a[middle]){
high = middle -1;
} else { // The element has been found
return true;
}
}
return false;
}
}
[/syntax]

Re: Загрузка фалов из интернета

Добавлено: 06 авг 2014, 20:02
vit9376
конечно же это не я писал. Просто сейчас учусь загружать файлы из интернета, нашёл кучу способов в интернете, но негде не объясняется как применить это если надо загрузить больше 1 файла. этот код взял для примера, я так понимаю там хорошо написан метод AsyncTask, и для загрузки следующих файлов надо писать for(String s : params)
try {
URL url = new URL(s);
...
...и т.д. при это у меня все равно появляются ошибки

Re: Загрузка фалов из интернета

Добавлено: 06 авг 2014, 20:56
altwin
vit9376 писал(а):конечно же это не я писал. Просто сейчас учусь загружать файлы из интернета, нашёл кучу способов в интернете, но негде не объясняется как применить это если надо загрузить больше 1 файла. этот код взял для примера, я так понимаю там хорошо написан метод AsyncTask, и для загрузки следующих файлов надо писать for(String s : params)
try {
URL url = new URL(s);
...
...и т.д. при это у меня все равно появляются ошибки
&nbspЧтобы загрузить файл - вам нужно знать откуда его(файл) брать, это и есть ваш url. Обращаетесь к url с запросом в котором передаете параметром имя файла. Соответсвенно если файлов несколько вам нужно менять этот параметр, а не весь url. Для этого можно использовать цикл, т.е. хранить имена файлов в списке и в цикле подставлять каждый в url выполняя запрос.
&nbspДалее вы уже можете всем этим управлять к примеру динамически формируя имена фалов, добавляя/удаляя их из списка и т.д. В том числе создавать приоритетные очереди запросов к примеру используя вместо списка структуру хранящуюю ключ/значение, где ключем будет имя файла, а значением его "вес", т.е. приоритет в очереди.. и т.д. все зависит от вашей фантазии и задачи.
В общем это все мелочи, как минимум вы можете имея список этих параметров для url в методе doInBackground() выполнить эти действия foreach url + параметр.

P.S. но вообще все это не совсем корректно, врятли вы будете знать имена файлов которые вам нужно загружать в реальной жизни... скорее всего вам нужно просмотреть содержимое директории и выбрать файл для скачивания, или скачать все которые isFile == true. Принцип тот же, выбрав файл пользователь по сути помещает его в тот же массив, итерация по которому и формирование/выполнение каждого запроса далее выгладит ровно также.