2016-07-26 1 views
0

Vous rencontrez des problèmes pour essayer d'utiliser une URL différente de cette même classe. J'accéderai aux pages Web semblables au ci-dessous beaucoup plus de fois.Comment accéder à différentes URL dans AsyncTask dans Java/Android

J'ai recherché de nombreux Q/As et tutoriels différents et je n'arrive pas à trouver comment passer une URL en tant que paramètre afin qu'elle soit utilisée dans la méthode doInBackground. J'appelle la méthode execute en tant que tel:

new RetrieveFeedTask().execute(); 
private class RetrieveFeedTask extends AsyncTask<Void, Void, String> { 

    protected void onPreExecute() { 
    } 

    protected String doInBackground(Void... urls) { 
     try { 
      URL url = new URL(API_URL_COMPETITIONS); // this is url http://api.football-data.org/v1/competitions 
      HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 
      try { 
       BufferedReader bufferedReader = new BufferedReader(new InputStreamReadelConnection.getInputStream())); 
       StringBuilder stringBuilder = new StringBuilder(); 
       String line; 
       while ((line = bufferedReader.readLine()) != null) { 
        stringBuilder.append(line).append("\n"); 
       } 
       bufferedReader.close(); 
       return stringBuilder.toString(); 
      } finally { 
       urlConnection.disconnect(); 
      } 
     } catch (Exception e) { 
      Log.e("ERROR", e.getMessage(), e); 
      return null; 
     } 
    } 

    //entire JSON page is saved in response 
    protected void onPostExecute(String response) { 
     if(response == null) { 
      response = "THERE WAS AN ERROR"; 
     } 
     Log.i("INFO", response); 
     try { 
      JSONArray comps = new JSONArray(response); 
      JSONObject second = comps.getJSONObject(1); //this is array element PremierLeague2016/2017 
      compArray.add("Competition"); 
      compArray.add(second.getString("caption")); 
      //i then set this to an ArrayAdapter and show the results in a Spinner.     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
      competition.setAdapter(adapter); 
      adapter.notifyDataSetChanged(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

apprécierais toute aide!

+0

Je suis confus quel est le problème.Vous devez remplacer 'API_URL_COMPETITIONS' et utiliser n'importe quelle URL que vous voulez –

+0

oui mais j'aurai besoin de cette URL pour un seul Spinner, puis une URL différente pour un autre Spinner et ainsi de suite. J'ai donc besoin de créer des instances de cette classe mais elle a une URL différente à chaque fois, si c'est possible mais je ne sais pas comment je vais le faire. – Lewisfitz07

+0

Il peut vous être utile d'utiliser la bibliothèque Volley et 'JsonObjectRequest' ou' JsonArrayRequest' –

Répondre

0

ne semblent pas trouver comment passer une URL en tant que paramètre de sorte qu'il est utilisé dans la méthode doInBackground

La classe AsyncTask est AsyncTask<Params, Progress, Result>. Vous voulez un paramètre String, pas un paramètre Void.

private class RetrieveFeedTask extends AsyncTask<String, Void, String> 

Ensuite, vous pouvez utiliser protected String doInBackground(String... urls) (car Void urls ne font pas de sens)

et mettre à jour votre appel

String url1 = "http://..."; 
String url2 = "http://..."; 
new RetrieveFeedTask().execute(url1, url2); 

Et doInBackground

for (String url : urls) { 
    try { 
     URL url = new URL(url); 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

Ou, oubliez la boucle ... Vous pouvez simplement accéder à urls[0] pour obtenir le premier String val UE, par exemple, juste faire attention de la IndexOutOfBoundsException

+0

Merci qui a fonctionné! – Lewisfitz07

0

Vous devez changer votre AsyncTask pour recevoir String (URL) comme paramètre:

//call 
String myURL = "http://....."; 
new RetrieveFeedTask().execute(myURL); 

... 

//change parameter type in declaration 
private class RetrieveFeedTask extends AsyncTask<String, Void, String> { 

    protected String doInBackground(String... urls) { 
     try { 
      // get the parameter 
      URL url = new URL(urls[0]); 
      ... 

https://developer.android.com/reference/android/os/AsyncTask.html

0

Votre première Void dans votre classe a besoin de Async tâche à l'argument:

private class RetrieveFeedTask extends AsyncTask<URL, Void, String> { 

Appelez-en passant l'url:

new RetrieveFeedTask().execute(url); 

Obtenir l'URL dans la tâche asynchrone:

protected String doInBackground(URL... urls) { 
    URL url = urls[0]; 

Si vous veulent passer plus d'un urls, les passer tout le long:

new RetrieveFeedTask().execute(url1, url2); 

... et les récupérer:

protected String doInBackground(URL... urls) { 
    URL url1 = urls[0]; 
    URL url2 = urls[1]; 

En outre, un coup d'oeil à la documentation.