Fragment和AsyncTask

时间:2012-10-19 10:59:49

标签: android rss android-asynctask android-fragments actionbarsherlock

我有8天的同样问题,我希望有人可以帮助我,我正在开发一个解析多个RSS源的应用程序,并在listview上显示片段,但问题是UI被阻止了2到4秒,每次用户触摸屏幕时应用程序崩溃。 我跟踪了问题,我发现我必须异步地提供数据,这实际上是我做的,但每次我有一个片段时,都会出现同样的问题。 实际上,如果片段从主线程执行,它会阻塞数据,而实际上我会异步地传输数据,这就是为什么我无法得到阻塞的原因。

这是我改变代码的方式,这是我的界面

public interface OnTaskFinishedListener {
void onTaskFinished(ArrayList<Article> articles);
}

我在AsyncTask中得到了像这样的

的ArrayList
public class AndroidSaxFeedParserAsync extends AsyncTask<String, Long,ArrayList<Article>> {
ArrayList<Article> rssItems = new ArrayList<Article>();

public URL feedUrl;

OnTaskFinishedListener onTaskFinishedListener;

public AndroidSaxFeedParserAsync(OnTaskFinishedListener _onTaskFinishedListener)
{
    onTaskFinishedListener = _onTaskFinishedListener ;
    }

@Override
protected void onPostExecute(ArrayList<Article> result) {
    super.onPostExecute(result);
    onTaskFinishedListener.onTaskFinished(result);
}
@Override
protected ArrayList<Article> doInBackground(String... params) {
//....
    return rssItems;
}   

}

最后我在像我这样的片段中得到它

public class FeedPlayerIndexFragment extends SherlockFragment implements OnTaskFinishedListener{

String url="http://www.whatever.com/index.php?format=feed&amp;type=rss";
ArrayList<Article> feeds;
ItemAdapterArticle lfa;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    new AndroidSaxFeedParserAsync(new OnTaskFinishedListener() {
        @Override
        public void onTaskFinished(ArrayList<Article> articles) {
        }
    }).execute(url);
    View view=inflater.inflate(R.layout.main, container, false);
//....
return view;
}

@Override
public void onTaskFinished(ArrayList<Article> articles) {
    lfa = new ItemAdapterArticle(getActivity().getApplicationContext(), articles);  
    }

}

1 个答案:

答案 0 :(得分:2)

问题是您正在使用实际阻止的AsyncTask.get()来电。这个问题的另一个解决方案是不阻止UI线程。您需要定义一个简单的界面:

public interface OnTaskFinishedListener {
    void onTaskFinished(List<Article> articles);
}

调用Fragment应该实现此接口。在实例化AsyncTask时,您将Fragment作为OnTaskFinishedListener实例作为参数发送给构造函数。 AsyncTask应该保留对OnTaskFinishedListener实例的引用,当工作完成后,在onPostExecute()中,您在实例上调用onTaskFinished()。现在,在Fragment中,您可以响应此调用并使用articles参数填充UI组件。希望这会有所帮助。