-1

曲名やアーティスト名などの音声メタデータを定期的に取得したい。そのために、非同期タスクでメディア メタデータ リトリーバーを使用しています。だから問題は

1) AsyncTask クラスでは、テキストを Taxt-view に割り当てるにはどうすればよいですか。

2)30秒の時間間隔など、特定の時間内にその非同期タスククラスを呼び出すにはどうすればよいですか。

3) 1 日に 1 回だけ取得する必要があるテキストがいくつかあります。では、前回のデータがいつフェッチされたかを確認するにはどうすればよいでしょうか? また、そのフェッチデータを保存してリストビューに使用するための最良の方法はどれですか?(つまり、それをデータベースまたはハッシュマップまたは配列リストに保存する必要がありますか?)

ここにメタデータ取得コードがあります

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.afragment, container, false);
}

@Override
public void onStart() {
    super.onStart();
    initfrag();
}

private void initfrag() {
    // TODO Auto-generated method stub
    lv1=(ListView)getView().findViewById(R.id.list);

    tv=(TextView)getView().findViewById(R.id.tv1);
    tv1=(TextView)getView().findViewById(R.id.tv2);
    LongOperation task=new LongOperation();
    task.execute();
}

class LongOperation extends AsyncTask<String, Void, String> {
    @Override
    protected String doInBackground(String... params) {
        MediaMetadataRetriever metaRetriever = new MediaMetadataRetriever();
        String link = "http://xyz-radio-link.ogg";
        metaRetriever.setDataSource(link, new HashMap<String, String>());
        // get mp3 info
        title = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
        artist = metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
        metaRetriever.release();  
        refreshtext();
        return null;
    }      
    @Override
    protected void onPostExecute(String result) {               
    }
    @Override
    protected void onPreExecute() {
    }
    @Override
    protected void onProgressUpdate(Void... values) {       
    }
}

public void refreshtext() {
    // TODO Auto-generated method stub
    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(),"fonts/Roboto-Regular.ttf");
    tv.setTypeface(tf);
    tv1.setTypeface(tf);
    tv.setText(artist);
    tv1.setText(title);
}
4

2 に答える 2

2

1) AsyncTask クラスでは、テキストを Taxt-view に割り当てるにはどうすればよいですか。

UIThreadで実行していないため、できません。私見のベスト プラクティスは、 を使用してこの値を UIThread に返すことonPostExecute()です。もう 1 つの選択肢はrunOnUIThread()、独自のRunnableクラスで使用することです。

2)30秒の時間間隔など、特定の時間内にその非同期タスククラスを呼び出すにはどうすればよいですか。

ScheduledExecutorServiceを使用できます。

3) 1 日に 1 回だけ取得する必要があるテキストがいくつかあります。では、前回のデータがいつフェッチされたかを確認するにはどうすればよいでしょうか?

前回をDB に保存します

そのフェッチデータを保存してListviewに使用する最良の方法は?(つまり、それをデータベースまたはハッシュマップまたは配列リストに保存する必要がありますか?)

独自のニーズに合わせてサブクラス化 (拡張)ArrayAdapterすると、それを直接使用してListView. ここに例があります。

于 2012-11-13T16:02:48.667 に答える
0

ハンドラーを使用すると、 postDelayedを使用して 30 秒ごとに実行するランナブルを作成できます。

于 2012-11-13T15:59:49.907 に答える