异步任务仅在调试模式下检索数据(android)

时间:2016-06-13 17:49:53

标签: android debugging asynchronous background rss

我有一个Android应用程序,我只想在列表视图中显示来自RSS提要的文本。应用程序仅在我以调试模式运行时检索Feed,并在Main活动中的某些行上使用断点。

我异步检索Feed,这可能是导致这种情况发生的原因之一,但我不太确定如何在没有调试器的情况下运行应用程序时立即显示Feed。

以下是主要活动:

public class MainActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ArrayList<String> headlines = new ArrayList<>();
    RetrieveFeed getXML = new RetrieveFeed();

    getXML.execute();

    headlines = getXML.heads();

    // Binding data
    ArrayAdapter adapter = new ArrayAdapter(this,
            android.R.layout.simple_list_item_1, headlines);

    setListAdapter(adapter);

}}

以下是在后台进行背景检索的类:

public class RetrieveFeed extends AsyncTask {

URL url;
ArrayList<String> headlines = new ArrayList();
ArrayList<String> links = new ArrayList();


@Override
protected Object doInBackground(Object[] params) {

    try {
        //does specific stuff here :)

    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return headlines;
}

private InputStream getInputStream(URL url) {
    try {
        return url.openConnection().getInputStream();
    } catch (IOException e) {
        return null;
    }
}

public ArrayList<String> heads()
{
    return headlines;
}}

1 个答案:

答案 0 :(得分:3)

问题是您在AsyncTask完成之前尝试访问数据。

getXML.execute();
headlines = getXML.heads();
// you execute your AsyncTask here and try to access it's data
// immediately, without waiting for it to finish execution

要解决此问题,您需要覆盖onPostExecute()中的AsyncTask(在doInBackground()完成后调用)并从那里填充/刷新ListView

您可以使RetrieveFeed成为MainActivity的内部类,这样您就可以直接访问ListView,或通过界面实现回调机制。

如果您选择后者,请查看this answer以获取示例。

要在执行期间显示ProgressDialog,您也应该覆盖onPreExecute()。从那里显示您的对话框并在onPostExecute()中将其关闭。

检查this answer以获取示例。