0

私は今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&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);  
    }

}

4

1 に答える 1

2

問題は、AsyncTask.get()実際にブロックしている呼び出しを使用していることです。この問題には、UIスレッドをブロックしない別の解決策があります。単純なインターフェースを定義する必要があります。

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

呼び出し元Fragmentはこのインターフェイスを実装する必要があります。インスタンス化するときは、コンストラクターへのパラメーターとしてインスタンスとして送信しAsyncTaskます。はインスタンスへの参照を保持する必要があり、作業が完了したら、でインスタンスを呼び出します。これで、でこの呼び出しに応答し、パラメーターを使用してUIコンポーネントにデータを入力できます。お役に立てれば。FragmentOnTaskFinishedListenerAsyncTaskOnTaskFinishedListeneronPostExecute()onTaskFinished()Fragmentarticles

于 2012-10-19T11:21:57.833 に答える