解决方案:
好的,我已经从你的答案中找到了解决方案,因为你的答案没有完全正常工作
首先我们需要使用Handler
将Runnable
发布到main / UI线程以运行UpdateDisplay()
,但在UIThread下定义ProgressDialog
而不是其他线程也是至关重要的
以下是最终代码:
public final String RSSFEEDOFCHOICE = "http://www.deals2buy.com/rssgen/tech.xml";
public final String tag = "RSSReader";
private RSSFeed feed = null;
private Handler handler = new Handler();
private ProgressDialog dialog;
/** Called when the activity is first created. */
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
dialog = ProgressDialog.show(RSSReader.this, "Loading",
"Loading, please wait..");
Thread t = new Thread() {
public void run() {
feed = getFeed(RSSFEEDOFCHOICE);
handler.post(new Runnable() {
public void run() {
dialog.dismiss();
UpdateDisplay();
};
});
}
};
t.start();
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
问题:
当Android应用程序首次加载时,会发生这种情况:
RSSFeed feed
将其解析为getFeed(String url)
实例变量。UpdateDisplay()
方法向ListView中的用户显示这些Feed。当发生这些情况时,我想向用户显示一个ProgressDialog以通知他们系统正在重新搜索内容,例如“正在加载,请稍候......”完成getFeed(String Url):RSSFeed
后,ProgressDialog将被解除并且{{将调用1}}。
所以这是我的第一次尝试:
UpdateDisplay():void
它没有显示public final String RSSFEEDOFCHOICE = "somewhere.xml"; //coming from http
public final String tag = "RSSReader";
private RSSFeed feed = null;
/** Called when the activity is first created. */
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait");
feed = getFeed(RSSFEEDOFCHOICE);
dialog.dismiss();
UpdateDisplay();
}
所以它没有按我想要的方式工作。因为我相信它是因为ProgressDialog继续进步,它应该由另一个ProgressDialog
处理。
这是我的第二次尝试:
Thread
直到public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Thread t = new Thread()
{
public void run()
{
ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait");
feed = getFeed(RSSFEEDOFCHOICE);
dialog.dismiss();
}
};
UpdateDisplay();
}
才可以,因为这个方法是由主线程处理的,而且它没有等待任何东西,所以我想也许我应该在UpdateDisplay()
之后将它放在t
线程之下。
所以我这样做了:
dialog.dismiss()
然后调试器在运行时说:只有处理public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Thread t = new Thread()
{
public void run()
{
ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait");
feed = getFeed(RSSFEEDOFCHOICE);
dialog.dismiss();
UpdateDisplay();
}
};
}
的主线程才能到达并使用View对象,因为它创建它们。
现在,我太乱了,想要退出编程。
有人可以帮助我:/
提前致谢。
答案 0 :(得分:1)
你可以使用AsyncTask,这正是它的用途。由于onPostExecute(长结果)在UI线程上完成,因此在查找View对象时不会崩溃。
的示例private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
您要做的是在doInBackground()中获取RSS提要,然后在onPostExecute中更新UI。
在onCreate()方法中,调用asyncTask。
new DownloadFilesTask().execute(url1, url2, url3);
答案 1 :(得分:1)
好的,我已经从你的答案中找到了解决方案,因为你的答案没有完全正常工作
首先,我们需要使用Handler
将Runnable发布到主/ UI线程以运行UpdateDisplay()
,但在ProgressDialog
下定义UIThread
而不是其他线程也是至关重要的
以下是最终代码:
public final String RSSFEEDOFCHOICE = "http://www.deals2buy.com/rssgen/tech.xml";
public final String tag = "RSSReader";
private RSSFeed feed = null;
private Handler handler = new Handler();
private ProgressDialog dialog;
/** Called when the activity is first created. */
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
dialog = ProgressDialog.show(RSSReader.this, "Loading",
"Loading, please wait..");
Thread t = new Thread() {
public void run() {
feed = getFeed(RSSFEEDOFCHOICE);
handler.post(new Runnable() {
public void run() {
dialog.dismiss();
UpdateDisplay();
};
});
}
};
t.start();
}
答案 2 :(得分:0)
您必须在另一个线程中运行您的请求而不是progressdialog。所以试试
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait");
Thread t = new Thread()
{
public void run()
{
feed = getFeed(RSSFEEDOFCHOICE);
dialog.dismiss();
UpdateDisplay();
}
};
}
根据您在更新显示中的操作,您应该在UI线程中运行它。
答案 3 :(得分:0)
实际上,最好的方法是使用AsyncTask
。
然而,作为一种快速解决方法,你可以这样做:
private Handler handler = new Handler();
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
Thread t = new Thread()
{
public void run()
{
ProgressDialog dialog = ProgressDialog.show(RSSReader.this, "Loading...", "Loading, please wait");
feed = getFeed(RSSFEEDOFCHOICE);
dialog.dismiss();
handler.post(new Runnable() {
public void run() {
UpdateDisplay();
}
});
}
};
}