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您将Fragment作为OnTaskFinishedListener实例作为参数发送给构造函数。AsyncTask应该保存对实例的引用,OnTaskFinishedListener当工作完成时,在 中onPostExecute(),您调用onTaskFinished()实例。现在,Fragment您可以响应此调用并使用articles参数来填充您的 UI 组件。希望这可以帮助。

于 2012-10-19T11:21:57.833 回答