私は今8日間同じ問題を抱えており、誰かが私を助けてくれることを願っています。私は複数のRSSフィードを解析し、それらをフラグメント付きのリストビューに表示するアプリケーションに取り組んでいますが、問題は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&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);
}
}