2016-01-15 6 views
7

私は自分のアプリでwebservicesを使用しています。基本的に私のアプリは、WordPressサイトの投稿を表示します。ユーザーは投稿をブックマークすることもできます。私はポストURLでsqliteのすべてのブックマーク投稿を保存しています。今問題は、私は多くの異なるURLを持っているということです。そして、私はこれらのURLの内容をOne ListViewに示したいと思います。1つ以上の異なるURLとリストビュー

これらのURLのjson構造も同じです。

私はこの問題に関連する他の質問を見てきましたが、あまり役に立たないです。

私はこれまでにどれだけ試してみましたかを教えてください。

は、ここでは、これがここに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); 
    } 
} 

のコードであるJSONでコード です。 (そのない正確に同じJSONしかし、私は、すべてのURLが同じ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" 
    } 
    ] 
} 

誰かがこれで私を助けることができます。どのように私はそのような状況で回避する必要がありますか?

+0

リストの – Vishwa

+0

から1つのjsonを投稿できますか? –

+0

私の質問が更新されました。親切に頑張ってください –

答えて

3

これを試してください...実際にはこのコードでは、ネットワーク操作用のVolley Libraryを使用しています。 まず、アプリケーションにApplicationクラスを作成して、ネットワーク操作用のVolleyライブラリの新しいインスタンスを作成しないようにします。アプリのbuild.gradleで

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

マニフェストファイルで依存関係

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

の下に次の行を追加Applicationタグにネットワーク

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

にアクセスするには、この権限を追加アプリケーションのクラス名

を述べました
<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> 
活動のonCreateで

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

あなたはアプリのコントロールクラスについてもっと教えていただけますか? –

+0

アプリケーションでシングルトンをサポートする(つまり、Volleyライブラリのインスタンス化を1つのオブジェクトに限定する) – Vishwa

+0

説明のためにシングルトンの感謝を知っています。特にというものを書いたコードを教えていただければ幸いです。私は非常にJavaとアンドロイドのものの新しいです –

1

は、あなたが1つの非同期呼び出しの結果を取得した後onBackgroundメソッド内のすべての実行を行うべきである...この行を追加します。これは、非同期タスクが別のスレッドで実行されるためです。

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. 
      } 
     } 
    } 
関連する問題