Activiy onCreate()期间的ProgressDialog问题:Android中的void

时间:2010-12-06 23:02:08

标签: java android multithreading

解决方案:

好的,我已经从你的答案中找到了解决方案,因为你的答案没有完全正常工作

首先我们需要使用HandlerRunnable发布到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应用程序首次加载时,会发生这种情况:

  1. 从Url检索RSS内容,并通过RSSFeed feed将其解析为getFeed(String url)实例变量。
  2. 通过UpdateDisplay()方法向ListView中的用户显示这些Feed。
  3. 当发生这些情况时,我想向用户显示一个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对象,因为它创建它们。

    现在,我太乱了,想要退出编程。

    有人可以帮助我:/

    提前致谢。

4 个答案:

答案 0 :(得分:1)

你可以使用AsyncTask,这正是它的用途。由于onPostExecute(长结果)在UI线程上完成,因此在查找View对象时不会崩溃。

以下是the asyncTask reference

的示例
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();
                }
            });
        }   
    };

}