`

Jamendo开源在线音乐播放器源码分析之Music搜索实现机制

阅读更多


   今天主要分析音乐搜索这部分的实现机制

 

   Jamendo代码里面实现音乐搜索主要是使用了Apache Http 4.0 和JSON,Jamendo官网提供API供应用程序查询数据,且提供了四种方式查询,依次是:Artist,Tag,UserPlaylist和UserStarredAlbums

  

   具体分析如下:

		private void albumSearch(int id){
			JamendoGet2Api service = new JamendoGet2ApiImpl();
			String query = mSearchEditText.getText().toString();
			Album[] albums = null;
			try {
				switch (id) {
				case 0:
					albums = service.searchForAlbumsByArtist(query);
					SearchActivity.this.mSearchMode = SearchMode.Artist;
					break;
				case 1:
					albums = service.searchForAlbumsByTag(query);
					SearchActivity.this.mSearchMode = SearchMode.Tag;
					break;
				case 3:
					albums = service.getUserStarredAlbums(query);
					SearchActivity.this.mSearchMode = SearchMode.UserStarredAlbums;
					break;

				default:
					return;
				}

				AlbumAdapter albumAdapter = new AlbumAdapter(SearchActivity.this); 
				albumAdapter.setList(albums);
				albumAdapter.setListView(mSearchListView);
				mAdapter = albumAdapter;

			} catch (JSONException e) {
				e.printStackTrace();
			} catch (WSError e) {
				publishProgress(e);
				this.cancel(true);
			}
		}

 

 

       在代码中提供了JamendoGet2Api接口及其接口实现JamendoGet2ApiImpl,那我们看看JamendoGet2Api提供了什么

  

	/**
	 * Retrieve "this week's most popular albums" 
	 * <br><br>
	 * http://api.jamendo.com/get2/id+name+url+image+artist_name/album/jsonpretty/?n=5&order=ratingweek_desc
	 * @return an array of albums
	 * @throws JSONException 
	 * @throws WSError 
	 */
	Album[] getPopularAlbumsWeek() throws JSONException, WSError;

 

 

 

 

随便拿一个查询PopularAlbumsWeek()函数来分析,通过看其注释,可以看出,Jamendo提供了http://api.jamendo.com/get2/id+name+url+image+artist_name/album/jsonpretty/?n=5&order=ratingweek_desc供应用程序查询和调用



 

 很明显是采用JSON的方式与服务器进行数据交互。接下来我们看看getPopularAlbumsWeeK()的实现:

	private String doGet(String query) throws WSError{
		return Caller.doGet(GET_API + query);
	}

	@Override
	public Album[] getPopularAlbumsWeek() throws JSONException, WSError {
		
		String jsonString = doGet("id+name+url+image+rating+artist_name/album/json/?n=20&order=ratingweek_desc");
		if(jsonString == null)
			return null;
		JSONArray jsonArrayAlbums = new JSONArray(jsonString); 
		return AlbumFunctions.getAlbums(jsonArrayAlbums);
		
	}

 

   调用Caller.doGet(GET_API+query):

	/**
	 * Performs HTTP GET using Apache HTTP Client v 4
	 * 
	 * @param url
	 * @return
	 * @throws WSError 
	 */
	public static String doGet(String url) throws WSError{
		
		String data = null;
		if(requestCache != null){
			data = requestCache.get(url);
			if(data != null){
				Log.d(JamendoApplication.TAG, "Caller.doGet [cached] "+url);
				return data;
			}
		}
		
		// initialize HTTP GET request objects
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet httpGet = new HttpGet(url);
		HttpResponse httpResponse;
		
		try {
			// execute request
			try {
				httpResponse = httpClient.execute(httpGet);
			} catch (UnknownHostException e) {
				WSError wsError = new WSError();
				wsError.setMessage(e.getLocalizedMessage());
				throw wsError;
			} catch (SocketException e){
				WSError wsError = new WSError();
				wsError.setMessage(e.getLocalizedMessage());
				throw wsError;
			}
			
			// request data
			HttpEntity httpEntity = httpResponse.getEntity();
			
			if(httpEntity != null){
				InputStream inputStream = httpEntity.getContent();
				data = convertStreamToString(inputStream);
				// cache the result
				if(requestCache != null){
					requestCache.put(url, data);
				}
			}
			
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		Log.d(JamendoApplication.TAG, "Caller.doGet "+url);
		return data;
	}

 

   在程序中调用convertStreamToString()讲Stream流转换成String

	private static String convertStreamToString(InputStream is) {

		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder sb = new StringBuilder();

		String line = null;
		try {
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return sb.toString();
	}

    然后在通过调用JSON提供的API方法,JSONArray jsonArrayAlbums = new JSONArray(jsonString);

  

	public static Album[] getAlbums(JSONArray jsonArrayAlbums) throws JSONException {
		int n = jsonArrayAlbums.length();
		Album[] albums = new Album[n];
		AlbumBuilder albumBuilder = new AlbumBuilder();
		
		for(int i=0; i < n; i++){
			albums[i] = albumBuilder.build(jsonArrayAlbums.getJSONObject(i));
		}
		
		return albums;
	}

 

 至此整个搜索完成

 

 

 

 

 

 

 最后总结下整个过程:

 1.获得调用的API URL链接,调用Caller.doGet()  实现方式是通过HttpClient,然后就是将获得的Stream转换成JSONArray构造所需要的String,最后就是调用  getAlbums(JSONArray jsonArrayAlbums) 。

  • 大小: 41.3 KB
  • 大小: 36.9 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics