2016-01-15 11 views
7

Używam usług internetowych w mojej aplikacji. Zasadniczo moja aplikacja pokazuje posty z witryny Wordpress. Użytkownik może także dodawać zakładki do postów. Zapisuję wszystkie posty z postami do książek w sqlite z adresami URL postów. Problem polega na tym, że mam wiele różnych adresów URL. Chcę pokazać zawartość tego adresu URL w One ListView.Więcej niż 1 różnych adresów URL i tylko jeden widok listy

Również struktura wszystkich tych adresów URL jest taka sama.

Przyjrzałem się innym kwestiom związanym z tą kwestią, ale te nie pomagają wiele.

Pozwól mi pokazać, jak wiele próbowałem do tej pory.

tutaj jest kod to kodeks BookmarkActivity

ArrayList<HashMap<String,String>> allData; 
String[] urlarray; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_bookmark); 
    SqliteController controller= new SqliteController(this); 

    allData = controller.getAllData(); 
    for (int i=0; i<allData.size(); i++){ 
     String url=allData.get(i).get("link"); 
     urlarray= new String[]{url}; 
    } 
    for(int i=0; i <urlarray.length; i++){ 
     MyAsyncTask task = new MyAsyncTask(i); 
     task.execute(); 
    } 
} 
private class MyAsyncTask extends AsyncTask<Object,Void,String>{ 
    int urlNumber; 
    HttpURLConnection connection=null; 
    BufferedReader reader=null; 
    public MyAsyncTask (int number){ 
     this.urlNumber=number; 
    } 
    @Override 
    protected String doInBackground(Object... params) { 
     try { 
      URL url = new URL(urlarray[urlNumber]); 
      connection= (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 
      String json = buffer.toString(); 
      return json; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     //Log.d("TAG",s); 
    } 
} 

tutaj jest JSON. (nie jest to dokładnie ten sam json, ale jestem pewien, że każdy adres URL będzie miał taką samą strukturę json)

{ 
    "status": "ok", 
    "count": 1, 
    "count_total": 1, 
    "pages": 1, 
    "posts": [ 
    { 
     "id": 1, 
     "type": "post", 
     "slug": "hello-world", 
     "url": "http:\/\/localhost\/wordpress\/?p=1", 
     "title": "Hello world!", 
     "title_plain": "Hello world!", 
     "content": "<p>Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!<\/p>\n", 
     "excerpt": "Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!\n", 
     "date": "2009-11-11 12:50:19", 
     "modified": "2009-11-11 12:50:19", 
     "categories": [], 
     "tags": [], 
     "author": { 
     "id": 1, 
     "slug": "admin", 
     "name": "admin", 
     "first_name": "", 
     "last_name": "", 
     "nickname": "", 
     "url": "", 
     "description": "" 
     }, 
     "comments": [ 
     { 
      "id": 1, 
      "name": "Mr WordPress", 
      "url": "http:\/\/wordpress.org\/", 
      "date": "2009-11-11 12:50:19", 
      "content": "<p>Hi, this is a comment.<br \/>To delete a comment, just log in and view the post's comments. There you will have the option to edit or delete them.<\/p>\n", 
      "parent": 0 
     } 
     ], 
     "comment_count": 1, 
     "comment_status": "open" 
    } 
    ] 
} 

Czy ktoś mi w tym pomoże? Jak powinienem poradzić sobie z taką sytuacją?

+0

Czy możesz wysłać jeden json z jednego adresu URL z listy – Vishwa

+0

ok poczekaj. pozwól mi opublikować –

+0

zaktualizowałem moje pytanie. Grzecznie to popatrz –

Odpowiedz

3

wypróbuj ten ... Właściwie w tym kodzie używam Biblioteki Volley do operacji sieciowych. Najpierw utwórz klasę aplikacji w swojej aplikacji, aby uniknąć tworzenia nowej instancji biblioteki Volley dla operacji sieciowych.

public class ApplicationController extends Application { 

public static final String TAG = ApplicationController.class 
     .getSimpleName(); 

private RequestQueue mRequestQueue; 
private ImageLoader mImageLoader; 

private static ApplicationController mInstance; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    mInstance = this; 
} 

public static synchronized ApplicationController getInstance() { 
    return mInstance; 
} 

public RequestQueue getRequestQueue() { 
    if (mRequestQueue == null) { 
     mRequestQueue = Volley.newRequestQueue(getApplicationContext()); 
    } 

    return mRequestQueue; 
} 

//This function request the volley library to process with tag 
    //where <T> a generic method with an unbound type variable T.You can pass any datatype to functions.for more info About generic method.go through this link:http://docs.oracle.com/javase/tutorial/extra/generics/methods.html 
public <T> void addToRequestQueue(Request<T> req, String tag) { 
    // set the default tag if tag is empty 
    req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 
    getRequestQueue().add(req); 
} 
//This function request the volley library to process with tag 
public <T> void addToRequestQueue(Request<T> req) { 
    req.setTag(TAG); 
    getRequestQueue().add(req); 
} 
//This function cancel the requested Url those are all in pending 
public void cancelPendingRequests(Object tag) { 
    if (mRequestQueue != null) { 
     mRequestQueue.cancelAll(tag); 
    } 
} 
} 

w APP build.gradle dodać tę linię pod zależnościami

compile 'com.mcxiaoke.volley:library-aar:1.0.0' 

W pliku manifestu dodać to uprawnienie dostępu do sieci

<uses-permission android:name="android.permission.INTERNET"></uses-permission> 

w tagu zastosowania wymienionych nazwę klasy aplikacji

<application 
    android:name=".ApplicationController" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    //your activity.... 
    </application> 

W działalności onCreate dodać tę linię ...

progressDialog=new ProgressDialog(MainClass.this); 
    progressDialog.setMessage("Loading..."); 
    progressDialog.show(); 
    //place your code to form urlarray 
    urlarray = new String[5]; 
    //where datas represents the arraylist to store received content from json response.if you want to show more datas add your custom object to arraylist 
    datas=new ArrayList<String>(); 

    adapter= new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, android.R.id.text1); 
    try { 
     for (int i = 0; i < urlarray.length; i++) { 
      final int j = i; 
      String url=urlarray[i]; 
      JsonObjectRequest objectRequest = new JsonObjectRequest(Request.Method.GET, url, (JSONObject) null, new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        Log.e("Response is for " + Integer.toString(j), response.toString()); 
     //Here i assumed received json response is same as of sample json Provided by you. 
        try{ 
        JSONArray jsonArray=response.getJSONArray("posts"); 
        if(jsonArray.length()>0){ 
         JSONObject obj=jsonArray.getJSONObject(0); 
         String content=obj.getString("content"); 
         datas.add(content); 
        } 
        if(j==urlarray.length-1) { 
         progressDialog.dismiss(); 
         adapter= new ArrayAdapter<String>(MainClass.this, 
           android.R.layout.simple_list_item_1, android.R.id.text1,datas); 
         listView.setAdapter(adapter); 
        } 
        }catch(Exception e){ 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("error",error.toString()); 
        if(j==urlarray.length-1) { 
         progressDialog.dismiss(); 
        } 
        } 
      }){ 
       @Override 
       public Map<String, String> getHeaders() throws AuthFailureError { 
        HashMap<String, String> headers = new HashMap<String, String>(); 
        headers.put("Content-Type", "application/json"); 
        headers.put("charset", "utf-8"); 
        return headers; 
       } 
      }; 
      objectRequest.setRetryPolicy(new DefaultRetryPolicy(5000, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
     ApplicationController.getInstance().addToRequestQueue(objectRequest, "JSON"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+0

Czy możesz mi wyjaśnić więcej o klasie kontrolera aplikacji? –

+0

do obsługi pojedynczej aplikacji (tj. Do ograniczenia instancji biblioteki Volley do jednego obiektu). – Vishwa

+0

Wiem, co to jest singleton dzięki za wyjaśnienie. Chciałbym, żebyś wytłumaczył mi kod, który napisałeś, szczególnie o rzeczach: . Jestem bardzo nowy w java i Androidzie. –

1

Ty powinien robić każdy wykonanie w metodzie onbackground Po uzyskaniu wyniku jednego asynchronicznego wywołania. Dzieje się tak, ponieważ zadanie asynchroniczne jest wykonywane na innym wątku.

ArrayList<HashMap<String,String>> allData; 
Iterator iterator; 
ArrayList<String> urlarray = new ArrayList<>(); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_bookmark); 
    SqliteController controller= new SqliteController(this); 

    allData = controller.getAllData(); 
    for (int i=0; i<allData.size(); i++){ 
     String url=allData.get(i).get("link"); 
     urlarray.add(url); 
    } 
    iterator = urlarray.iterator(); 
    MyAsyncTask task = new MyAsyncTask(); 
    task.execute(); 

} 
private class MyAsyncTask extends AsyncTask<Object,Void,ArrayList<String>>{ 
    int urlNumber; 
    ArrayList<String> resultList = new ArrayList<>(); 
    HttpURLConnection connection=null; 
    BufferedReader reader=null; 
    public MyAsyncTask(){ 

    } 
    @Override 
    protected String doInBackground(Object... params) { 
     if(iterator.hasNext()) { 
      try { 

      URL url = new URL(iterator.next()); 
      connection= (HttpURLConnection) url.openConnection(); 
      connection.connect(); 
      StringBuffer buffer = new StringBuffer(); 
      String line = ""; 
      while ((line = reader.readLine()) != null) { 
       buffer.append(line); 
      } 
      String json = buffer.toString(); 
      resultList.add(json); 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     } 
     return resultList; 
    } 
     @Override 
     protected void onPostExecute(ArrayList<String> s) { 
      super.onPostExecute(s); 
      //Log.d("TAG",s); 
      if(s.size > 0){ 
       //Your listview processing here. 
      } 
     } 
    }