如何在一段时间内调用异步任务

时间:2012-11-13 15:46:16

标签: android

我想定期获取音频元数据,如歌曲名称和艺术家姓名。 因为我在Async-task中使用媒体元数据检索器。 所以问题是

1)在AsyncTask类中,如何将文本分配给Taxt-view。

2)如何在特定时间内调用Async-task类,如30秒时间间隔。

3)有一些文字我需要一天只能获取一次。那么如何在上次获取数据时检查?还有哪个是存储获取数据并将其用于Listview的最佳方法?(我的意思是我需要将其存储到数据库或任何散列图或数组列表中?)

这是元数据转发器代码

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

2 个答案:

答案 0 :(得分:2)

  

1)在AsyncTask类中,如何将文本分配给Taxt-view。

你不能,因为你没有在UIThread上运行。恕我直言最佳做法是使用onPostExecute()将此值返回到UIThread。另一种选择是将runOnUIThread()与您自己的Runnable类一起使用。

  

2)如何在特定时间内调用Async-task类,例如   30秒的时间间隔。

您可以使用ScheduledExecutorService

  

3)有一些文字我需要一天只能获取一次。所以   如何在上次获取数据时检查?

将最后一次保存到your DB

  

存储获取数据并将其用于Listview的最佳方法?(i   意味着我需要将其存储到数据库或任何hashmap或数组中   列出?)

子类(扩展)ArrayAdapter以满足您的需求,然后您可以直接使用它来提供ListViewHere就是一个例子。

答案 1 :(得分:0)

使用处理程序,您可以使用postDelayed创建一个每30秒运行一次的运行。