我有8天的同样问题,我希望有人可以帮助我,我正在开发一个解析多个RSS源的应用程序,并在listview上显示片段,但问题是UI被阻止了2到4秒,每次用户触摸屏幕时应用程序崩溃。 我跟踪了问题,我发现我必须异步地提供数据,这实际上是我做的,但每次我有一个片段时,都会出现同样的问题。 实际上,如果片段从主线程执行,它会阻塞数据,而实际上我会异步地传输数据,这就是为什么我无法得到阻塞的原因。
这是我改变代码的方式,这是我的界面
public interface OnTaskFinishedListener {
void onTaskFinished(ArrayList<Article> articles);
}
我在AsyncTask中得到了像这样的
的ArrayListpublic 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&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);
}
}
答案 0 :(得分:2)
问题是您正在使用实际阻止的AsyncTask.get()
来电。这个问题的另一个解决方案是不阻止UI线程。您需要定义一个简单的界面:
public interface OnTaskFinishedListener {
void onTaskFinished(List<Article> articles);
}
调用Fragment
应该实现此接口。在实例化AsyncTask
时,您将Fragment
作为OnTaskFinishedListener
实例作为参数发送给构造函数。 AsyncTask
应该保留对OnTaskFinishedListener
实例的引用,当工作完成后,在onPostExecute()
中,您在实例上调用onTaskFinished()
。现在,在Fragment
中,您可以响应此调用并使用articles
参数填充UI组件。希望这会有所帮助。