2016-01-15 5 views
7

Ich verwende Webservices in meiner App. Grundsätzlich zeigt meine App Posts von Wordpress-Seiten. Der Benutzer kann auch die Posts mit einem Lesezeichen versehen. Ich speichere alle Lesezeichen-Posts in sqlite mit Post-URLs. Jetzt ist das Problem, ich habe viele verschiedene URLs. Und ich möchte den Inhalt dieser URL in One ListView zeigen.Mehr als 1 verschiedene URLs und nur eine Listenansicht

Auch JSON-Struktur aller dieser URLs ist gleich.

Ich habe andere Fragen zu diesem Thema angeschaut, aber die helfen nicht viel.

Lassen Sie mich Ihnen zeigen, wie viel ich bisher versucht habe.

hier Code dies Code von 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); 
    } 
} 

hier ist json. (Es ist nicht genau das gleiche json, aber ich bin sicher, dass jeder url gleiche json Struktur haben wird)

{ 
    "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" 
    } 
    ] 
} 

jemand mir dabei helfen kann. Wie soll ich mit einer solchen Situation umgehen?

+0

können Sie einen JSON von einer der URL aus der Liste – Vishwa

+0

ok warten, warten. lass mich posten –

+0

aktualisiert meine Frage. schaue es mir an –

Antwort

3

versuchen Sie diese ... Eigentlich in diesem Code bin ich mit Volley-Bibliothek für Netzwerkbetrieb. Erstellen Sie zunächst eine Application-Klasse in Ihrer Anwendung, um das Erstellen einer neuen Instanz der Volley-Bibliothek für Netzwerkoperationen zu vermeiden.

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); 
    } 
} 
} 

In App build.gradle diese Zeile

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

In Manifest-Datei, diese Erlaubnis

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

in Application-Tag erwähnt die Anwendung Klassenname

zuzugreifen Netzwerk hinzufügen unter Abhängigkeiten hinzufügen
<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> 

In Activity onCreate diese Zeile hinzufügen ...

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

Kannst du mir mehr über App Controler Klasse erklären? –

+0

zur Unterstützung von Singleton in Anwendung (d. H. Um die Instanziierung einer Volley-Bibliothek auf ein Objekt zu beschränken) – Vishwa

+0

Ich weiß, was Singleton ist, danke für die Erklärung. Ich würde es gerne, wenn du mir den Code erklärst, den du speziell geschrieben hast . Ich bin sehr neu in Java und Android-Zeug –

1

Sie sollten jede Ausführung im onbackground Methode tun, nachdem Sie das Ergebnis eines asynchronen Aufruf erhalten. Dies liegt daran, dass die asynchrone Task in einem anderen Thread ausgeführt wird.

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. 
      } 
     } 
    } 
Verwandte Themen