V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XinLake
V2EX  ›  Android

这段代码如何优化

  •  
  •   XinLake · 2018-04-15 15:16:53 +08:00 · 9677 次点击
    这是一个创建于 2413 天前的主题,其中的信息可能已经有所发展或是发生改变。
    String[] meta_head = {
            "Title",
            "Artist",
            "Genre",
            "Copyright",
            "Album",
            "TrackNumber",
            "Description",
            "Rating",
            "Date",
            "Setting",
            "URL",
            "Language",
            "NowPlaying",
            "Publisher",
            "EncodedBy",
            "ArtworkURL",
            "TrackID",
            "TrackTotal",
            "Director",
            "Season",
            "Episode",
            "ShowName",
            "Actors",
            "AlbumArtist",
            "DiscNumber",
            "MAX",
    };
    String[] meta_data = {
            media.getMeta(Media.Meta.Title),
            media.getMeta(Media.Meta.Artist),
            media.getMeta(Media.Meta.Genre),
            media.getMeta(Media.Meta.Copyright),
            media.getMeta(Media.Meta.Album),
            media.getMeta(Media.Meta.TrackNumber),
            media.getMeta(Media.Meta.Description),
            media.getMeta(Media.Meta.Rating),
            media.getMeta(Media.Meta.Date),
            media.getMeta(Media.Meta.Setting),
            media.getMeta(Media.Meta.URL),
            media.getMeta(Media.Meta.Language),
            media.getMeta(Media.Meta.NowPlaying),
            media.getMeta(Media.Meta.Publisher),
            media.getMeta(Media.Meta.EncodedBy),
            media.getMeta(Media.Meta.ArtworkURL),
            media.getMeta(Media.Meta.TrackID),
            media.getMeta(Media.Meta.TrackTotal),
            media.getMeta(Media.Meta.Director),
            media.getMeta(Media.Meta.Season),
            media.getMeta(Media.Meta.Episode),
            media.getMeta(Media.Meta.ShowName),
            media.getMeta(Media.Meta.Actors),
            media.getMeta(Media.Meta.AlbumArtist),
            media.getMeta(Media.Meta.DiscNumber),
            media.getMeta(Media.Meta.MAX),
    };
    for (int i = 0; i < meta_data.length; ++i) {
        if (meta_data[i] == null) {
            continue;
        }
    
        TableRow tableRow = inflateRow(meta_head[i], meta_data[i]);
        vTableLayout.addView(tableRow);
    }
    

    如果有信息则添加一行(没有找到信息则跳过不显示),效果如下

    device-2018-04-15-143306.jpg

    第 1 条附言  ·  2018-04-16 16:49:49 +08:00
    // meta data
    String[][] metaHeadData = {
            {cache_meta_title, media.getMeta(Media.Meta.Title)},
            {cache_meta_artist, media.getMeta(Media.Meta.Artist)},
            {cache_meta_genre, media.getMeta(Media.Meta.Genre)},
            {cache_meta_copyright, media.getMeta(Media.Meta.Copyright)},
            {cache_meta_album, media.getMeta(Media.Meta.Album)},
            {cache_meta_tracknumber, media.getMeta(Media.Meta.TrackNumber)},
            {cache_meta_description, media.getMeta(Media.Meta.Description)},
            {cache_meta_rating, media.getMeta(Media.Meta.Rating)},
            {cache_meta_date, media.getMeta(Media.Meta.Date)},
            {cache_meta_setting, media.getMeta(Media.Meta.Setting)},
            {cache_meta_url, media.getMeta(Media.Meta.URL)},
            {cache_meta_language, media.getMeta(Media.Meta.Language)},
            {cache_meta_nowplaying, media.getMeta(Media.Meta.NowPlaying)},
            {cache_meta_publisher, media.getMeta(Media.Meta.Publisher)},
            {cache_meta_encodedby, media.getMeta(Media.Meta.EncodedBy)},
            {cache_meta_artworkurl, media.getMeta(Media.Meta.ArtworkURL)},
            {cache_meta_trackid, media.getMeta(Media.Meta.TrackID)},
            {cache_meta_tracktotal, media.getMeta(Media.Meta.TrackTotal)},
            {cache_meta_director, media.getMeta(Media.Meta.Director)},
            {cache_meta_season, media.getMeta(Media.Meta.Season)},
            {cache_meta_episode, media.getMeta(Media.Meta.Episode)},
            {cache_meta_showname, media.getMeta(Media.Meta.ShowName)},
            {cache_meta_actors, media.getMeta(Media.Meta.Actors)},
            {cache_meta_albumartist, media.getMeta(Media.Meta.AlbumArtist)},
            {cache_meta_discnumber, media.getMeta(Media.Meta.DiscNumber)},
            {cache_meta_max, media.getMeta(Media.Meta.MAX)},
    };
    

    我已经改成上面这样了,虽然密密麻麻,搞个二维数组代码还是稍微优雅点。cache_meta_xxx 这些是 String,支持多语言。

    device-2018-04-16-163843.jpg

    10 条回复    2018-04-16 19:09:40 +08:00
    asj
        1
    asj  
       2018-04-15 15:35:05 +08:00 via Android
    挺好的啊,不知道你要优化什么

    喜欢的话可以把两个数组改成一个对象的数组,看起来 header 和 data 的关系更清楚一些。
    AlisaDestiny
        2
    AlisaDestiny  
       2018-04-15 16:44:19 +08:00
    我觉得也还行。
    但是如果你还想优化的话你 meta_data 数组用 meta_head 定义的字符数组根据名称反射拿到对应的属性。
    fireapp
        3
    fireapp  
       2018-04-15 17:49:20 +08:00 via Android
    enum(String, String) 啊
    sununiq
        4
    sununiq  
       2018-04-15 21:11:05 +08:00
    枚举,关联 head 和 data
    aristotll
        5
    aristotll  
       2018-04-15 21:47:47 +08:00
    枚举应该是更好的 方式 可以保证总是能对上 然后用 values 方法
    aristotll
        6
    aristotll  
       2018-04-15 22:04:41 +08:00
    今天好无聊 改写了一个...


    @AllArgsConstructor
    enum Row {
    Title(Meta.Title),
    Artist(Meta.Artist);
    private final Meta data;

    public String metaFrom(final Media media) {
    return media.getMeta(this.data);
    }

    public static void main(final Media media) {
    for (final Row row : Row.values()) {
    final String meta = row.metaFrom(media);
    if (meta == null) {
    continue;
    }
    final TableRow tableRow = inflateRow(row.name(), meta);
    }
    }

    }
    814084764
        7
    814084764  
       2018-04-15 23:02:55 +08:00
    HashMap?
    privatezcoding
        8
    privatezcoding  
       2018-04-16 09:46:20 +08:00
    Android 开发并不推荐枚举 变量命名应该使用驼峰
    WispZhan
        9
    WispZhan  
       2018-04-16 11:47:29 +08:00
    枚举或者 Map。个人推荐类型安全的枚举。
    kifile
        10
    kifile  
       2018-04-16 19:09:40 +08:00
    假设 Meta 是枚举

    String[] meta_data = {
    media.getMeta(Media.Meta.Title),
    media.getMeta(Media.Meta.Artist),
    media.getMeta(Media.Meta.Genre),
    media.getMeta(Media.Meta.Copyright),
    media.getMeta(Media.Meta.Album),
    media.getMeta(Media.Meta.TrackNumber),
    media.getMeta(Media.Meta.Description),
    media.getMeta(Media.Meta.Rating),
    media.getMeta(Media.Meta.Date),
    media.getMeta(Media.Meta.Setting),
    media.getMeta(Media.Meta.URL),
    media.getMeta(Media.Meta.Language),
    media.getMeta(Media.Meta.NowPlaying),
    media.getMeta(Media.Meta.Publisher),
    media.getMeta(Media.Meta.EncodedBy),
    media.getMeta(Media.Meta.ArtworkURL),
    media.getMeta(Media.Meta.TrackID),
    media.getMeta(Media.Meta.TrackTotal),
    media.getMeta(Media.Meta.Director),
    media.getMeta(Media.Meta.Season),
    media.getMeta(Media.Meta.Episode),
    media.getMeta(Media.Meta.ShowName),
    media.getMeta(Media.Meta.Actors),
    media.getMeta(Media.Meta.AlbumArtist),
    media.getMeta(Media.Meta.DiscNumber),
    media.getMeta(Media.Meta.MAX),
    };
    meta_data.stream().filter(s->s!=null)
    .map(s->inflateRow(s.name(), s)
    .forEach(s->vTableLayout.addView(s));
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1710 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:44 · PVG 00:44 · LAX 08:44 · JFK 11:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.