Jamendoオープンソースオンライン音楽プレーヤーソース分析(四)


四、ネットワーク操作、music APIを呼び出す
HomeActivityの上のgalleryがロードしたのは今週最も流行しているアルバムで、NewsTaskで非同期でロードされています.次に、ネットワークapiを要求する流れを大体歩いてみましょう.NewsTaskのdoInBackground()では:
JamendoGet2Api server = new JamendoGet2ApiImpl();
Album[] albums = null;
albums = server.getPopularAlbumsWeek();
com.teleca.jamendo.apiパケットは、関連するmusic APIを呼び出すインタフェースパケットである.
JamendoGet 2 Apiはmusic apiを呼び出すインタフェースであり、これらのapiを呼び出すにはいかなる形式の授権も必要ないため、例えば新浪微博を呼び出すインタフェースとは異なり、oauthによる授権が必要であるため、JamendoGet 2 Api service=new JamendoGet 2 ApiImpl();それから相応の方法を呼び出して、直接REST方式を通じて直接相応のapiを呼び出して、私达はインタフェースの中のすべての方法がすべて解釈があることを见て、相応のapiも书いて、更に详しく参考することができます:http://developer.jamendo.com/en/wiki/Musiclist2Api .
JamendoGet 2 ApiImplはJamendoGet 2 Apiの実装であり、今週最もポピュラーなアルバムを取得するgetPopularAlbumsWeek()メソッドを追跡し、GETメソッドで要求し、Callerクラスに追跡するdoGet()メソッドであり、http操作はApache HTTP Clientパッケージを使用し、この中にキャッシュを使用して、今回のリクエスト結果をキャッシュし、ネットワークオーバーヘッドを低減し、これは後で話しましょう.
具体的なhttp操作は多くありませんが、コードを見てください.getメソッドはjson列を返し、ブラウザでこのapiに直接アクセスすることができます.http://api.jamendo.com/get2/id+name+url+image+artist_name/album/jsonpretty/?n=5&order=ratingweek_descでは、返されるjson列が表示されます.androidでは、json文字列を処理する方法が提供されています.返されるjson列は大きなJSOnArrayで、中にはそれぞれJSOnObject、すなわち対応するアルバムの情報が表示されます.getPopularAlbumsWeek()では、json列を対応するオブジェクトの配列に変換しています.ここではAlbum[]です.各JSOnObjectの情報をAlbumエンティティークラスにセットします.主にAlbumFunctionsとAlbumBuilderの2つのクラスです.
返されるAlbum[]はgalleryのadapterに使用され、直接setList()メソッドで入れられます.ネットワーク操作という大同小異は,他のapiステップを呼び出すのと似ている.
上は具体的な流れで、apiを非同期で要求し、ネットワーク操作はjson列を返し、jsonを処理してオブジェクトに変換し、最後に、このようなネットワークパッケージはみんなも自分のコードに使うことができることを示しています.JAmendoは階層がはっきりしていて、パッケージもよくできています.
ちなみにCallerで使われているキャッシュです.次に、キャッシュとキャッシュを取得するコードを示します.
	/**
	 * Cache for most recent request
	 */
	private static RequestCache requestCache = null;

	String data = null;
	if(requestCache != null){
		data = requestCache.get(url);
		if(data != null){
			Log.d(JamendoApplication.TAG, "Caller.doGet [cached] "+url);
			return data;
		}
	}

	if(httpEntity != null){
		InputStream inputStream = httpEntity.getContent();
		data = convertStreamToString(inputStream);
		// cache the result
		if(requestCache != null){
			requestCache.put(url, data);
		}

        }
そのプログラムはどこでnewがこのRequestCacheのオブジェクトを出したのか、Callerクラスには静的setRequestCache()の方法があり、どこでこの方法を呼び出したのかを説明し、その前に呼び出したのか、JamendoApplicationというグローバルなアプリケーションを思いつきました.このクラスは最初のactivityが実行される前に実行され、独自のライフサイクルがあります.そのonCreate()メソッドでsetRequestCache()メソッドが見つかりました.
mRequestCache = new RequestCache();
Caller.setRequestCache(mRequestCache);
次はRequestCacheというキャッシュクラスを見てみましょう.
private LinkedList history;
private Hashtable<String, String> cache;
は最大10個のデータをキャッシュすることができ、historyはリクエストのurlを格納するためにキューを使用し、10個を超えると、キューのトップのpollを外に出す.cacheはhashtableがurlの戻り結果jsonを格納するために使用され、historyは主にcacheのremove操作を支援するために使用され、クエリーするurlがcacheにすでに存在する場合は、cacheから取り出し、ネットワークを再要求するオーバーヘッドを省く.
public void put(String url, String data){
		history.add(url);
		// too much in the cache, we need to clear something
		if(history.size() > CACHE_LIMIT){
			String old_url = (String) history.poll();
			cache.remove(old_url);
		}
		cache.put(url, data);
}
public String get(String url){
		return cache.get(url);
}