异步任务仅在调试模式下检索数据 (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 示例。
我有一个 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 示例。