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

Asynchronous Task only retrieving data in debug mode (android)

我有一个 android 应用程序,我只想在列表视图中显示来自 RSS 提要的文本。应用程序仅在我 运行 处于调试模式时检索提要,在 Main activity.

的某些行上有断点

我异步检索提要,所以这可能是发生这种情况的原因之一,但我不太确定当我 运行 没有调试器的应用程序时如何让它立即显示提要。

这里是主要的activity:

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

}}

这里是后台做后台检索的class:

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

问题是您试图在 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

要解决此问题,您需要覆盖 AsyncTask 中的 onPostExecute()(在 doInBackground() 完成后调用)和 populate/refresh 您的 ListView 从那里开始。

您可以将 RetrieveFeed 设为 MainActivity 的内部 class,这样您就可以直接访问您的 ListView,或者通过接口实现回调机制。

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

要在执行期间显示 ProgressDialog,您还应该覆盖 onPreExecute()。从那里显示您的对话框并在 onPostExecute().

中关闭它

查看 this answer 示例。