2017-01-20 1 views
0

Ich versuche gerade, eine Ladung JSON-Daten von etwa 5000 verschiedenen URLs herunterzuladen. Die URLs sind identisch mit Ausnahme einer Zahl in ihnen, die sequenziell zunimmt, also habe ich beschlossen, die JSON-Daten von jeder URL nacheinander zu durchsuchen (da ich sie dann in eine SQLite-Datenbank einfügen kann, ohne dass ich das tun muss) mach dir Sorgen über Multithreading zu viel).Langsame Downloads von JSON-Daten von URLs

Das Problem, das ich habe ist, dass die Zeit, die es dauert, um die JSON-Daten aus den URLs zu bekommen, sehr langsam ist (denke ich) für ziemlich kleine JSON-Dateien, und sind völlig inkonsistent mit ihren jeweiligen Größen. Sie ändern sich auch viel laufen-by-Lauf:

  Run 1  Run 2  File size 

File 2  1.870s  0.880s  8.5 kB 
File 3  0.590s  0.880s  19.3 kB 
File 4  0.680s  0.590s  2.4 kB 
File 5  0.570s  2.770s  0.9 kB 
File 10  12.070s  0.600s  3.9 kB 
File 44  12.370s  2.150s  17.1 kB 

Ich bin derzeit diese mit einer erweiterten AsyncTask Klasse bekommen, die von einer MainActivity Klasse aufgerufen wird. Die AsyncTask gibt dann einen Ergebnis-String zurück (was ich noch nicht mache) und startet die nächste AsyncTask, um die nächste JSON-Datei von der nächsten URL zu holen (was ich gerade mache). Jetzt stoppe ich nach 50 JSON-Dateien. Hier ist der relevante Code:

MainActivity

public class MainActivity extends ActionBarActivity implements AsyncDownloadClass.AsyncResponseInterface 
{ 
    private int currentCompanyId; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toast.makeText(this, "Downloading JSON data", Toast.LENGTH_SHORT).show(); 

     currentCompanyId = 1; 
     new AsyncDownloadClass(this).execute(""+currentCompanyId); 
    } 

    @Override 
    public void processFinish(CompanyObject companyObject) 
    { 
     if (currentCompanyId < 50) 
     { 
      currentCompanyId++; 
      new AsyncDownloadClass(this).execute(""+currentCompanyId); 
     } 
    } 
} 

AsyncDownloadClass

import static android.os.Process.THREAD_PRIORITY_DEFAULT; 

public class AsyncDownloadClass extends AsyncTask<String, Void, String> 
{ 
    public AsyncResponseInterface asyncResponseInterface = null; 

    public interface AsyncResponseInterface 
    { 
     void processFinish(CompanyObject companyObject); 
    } 

    public AsyncDownloadClass(AsyncResponseInterface asyncResponseInterface) 
    { 
     this.asyncResponseInterface = asyncResponseInterface; 
    } 

    @Override 
    protected String doInBackground(String... params) 
    { 
     // Use this to give AsyncDownloadTask more CPU power 
     Process.setThreadPriority(THREAD_PRIORITY_DEFAULT); 

     String resultStr = null; 
     String companyId = params[0]; 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 

     try 
     { 
      URL url = new URL("http://barnivore.com/company/" + companyId + ".json"); 

      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      StringBuilder stringBuilder = new StringBuilder(); 
      if (inputStream == null) 
      { 
       return null; 
      } 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String line; 
      while ((line = reader.readLine()) != null) 
      { 
       stringBuilder.append(line); 
      } 

      if (stringBuilder.length() == 0) 
      { 
       return null; 
      } 

      resultStr = stringBuilder.toString(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      if (urlConnection != null) 
      { 
       urlConnection.disconnect(); 
      } 

      if (reader != null) 
      { 
       try 
       { 
        reader.close(); 
       } 
       catch (IOException e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 

     Log.d("ADC", "Finished downloading company " + companyId + " JSON data"); 

     return resultStr; 
    } 

    @Override 
    protected void onPostExecute(String result) 
    { 
     super.onPostExecute(result); 
     asyncResponseInterface.processFinish(null); 
    } 
} 

Wie Sie sehen können, ich weiß nicht einmal die JSON-Daten analysieren oder es zurück an den MainActivity senden, so die seltsame Langsamkeit muss vom Herunterladen der JSON-Daten kommen.

Ich bin auch offen für irgendwelche Tipps, wie man den ganzen Prozess beschleunigen kann, da ich ~ 5000 davon herunterladen muss, und sogar bei 1/sec werde ich mindestens eine Stunde oder so warten. ..

Thanks :)

+0

Verwenden Sie Retrofit, um Json zu bekommen, es ist schneller –

Antwort

0

Sie sollten diese AsyncTasks parallel ausführen. Das würde einen großen Unterschied machen.