0

我已经有8天的相同问题了,我希望有人可以帮助我,我正在解析多个RSS提要并将它们显示在带有片段的listview上的应用程序,但问题在于UI被阻止2到4秒,并且每次用户触摸屏幕时,应用程序都会崩溃。 我跟踪了这​​个问题,发现我不得不异步使用这些数据,但实际上,每当我有一个片段时,都会发生同样的问题。 实际上,如果它从主线程中获取数据,则会阻塞该数据块,而我实际上是异步导入数据的,这就是为什么我无法获取阻塞的原因。片段和AsyncTask

这是我改变我的代码,这是我的接口

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

我收到的ArrayList中的AsyncTask这样

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); 
    } 

}

回答

2

问题是您正在使用实际阻止的AsyncTask.get()调用。这个问题还有另一个解决方案,它不会阻塞UI线程。您需要定义一个简单的接口:

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

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

+0

我试过代码,但ArrayList

在Fragment中返回null,你能为我写代码吗? –

+0

@ user1664332,我不能为你写代码,我不是自由职业者。我给了你一个解决方案的想法,现在你的工作就是实现它。如果你还没有完全理解这个想法,请随时提出任何问题。 – Egor

+0

你能不能更清楚一点,所以我可以自己实现它,让我遵循的步骤,我会尝试,直到现在我使我的接口,使片段实现它,我做了一个构造函数AsyncTask(OnTaskFinishedListener),所以现在我有两个onTaskFinished方法在片段之一执行的接口和第二个由于AsyncTask的片段调用和finallt我打电话的onTostkFinished()在asyncTask的onPostExecute(),但我没有结果。 –