如何在使用AsyncTask时更新UI

时间:2013-07-24 18:43:11

标签: android android-asynctask toast

我的简单应用设置为在点击Refresh按钮时检索RSS Feed 单击刷新按钮会启动AsyncTask,以检索Feed。 AsyncTask是主要活动的子标记。

这是我班级的样子:

public class NasaDailyImage extends Activity{
    public ProgressDialog modalDialog = null; //problematic
//------------------------------------------------------------------------------
    @Override
    protected void onCreate(Bundle savedInstanceState){
        //instantiate the ProgressDialog
        Button b = //get reference to button
        b.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                modalDialog.show(); // show modal
                Toast.makeText(getApplicationContext(), "Getting feeds", 500).show();
                new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !!
            }
        });
    }
//------------------------------------------------------------------------------
    public synchronized void resetDisplay(boolean parseErrorOccured, 
        boolean imageErrorOccured,
        IotdHandler newFeeds){
        if(parseErrorOccured || imageErrorOccured){
            // make a Toast
            // do not update display
        }else{
            // make a Toast
            // update display
            // based on new feed
        }
    }
//------------------------------------------------------------------------------
    class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{

        @Override
        protected IotdHandler doInBackground(IotdHandler... arg0) {
            IotdHandler handler = arg0[0];
            handler.processFeed(); // get the RSS feed data !
            return handler;
        }
//------------------------------------------------------------------------------    
        @Override
        protected void onPostExecute(IotdHandler fromInBackground){
            resetDisplay( // call to update the display
            fromInBackground.errorOccured,
            fromInBackground.imageError,
            fromInBackground);
        }
//------------------------------------------------------------------------------


}  

问题在于show()modalDialog的{​​{1}}。这导致我的应用程序崩溃。 为什么?如何解决?

3 个答案:

答案 0 :(得分:2)

ProgressDialog nullNPE,因此当您致电show()时,您会 @Override protected void onCreate(Bundle savedInstanceState){ //instantiate the ProgressDialog // can set message, title, etc. here Button b = //get reference to button b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { modalDialog = ProgressDialog.show(NasaDailyImage .this, "Enter Title", "Enter Message"); 。在调用方法之前实例化它。

可能在某处像这里实例化它然后在显示之前设置消息,标题,你想要的任何东西

{{1}}

答案 1 :(得分:2)

无法在后台线程上更新ui。在后台线程上调用doinBAckground。您应该使用进度对话框来显示Async Task,然后您可以更改用户界面(UI)中的任何内容。

第1步:首先初始化您的进度对话框。

ProgressDialog progressDialog;

步骤2:然后在进度对话框开始之下启动doBackground工作。

progressDialog = ProgressDialog.show(Activity1.this, "",
                        "Loading...");

步骤3:完成工作后,最后关闭进度对话框。

progressDialog.dismiss();

在进度平均时间对话框中,您可以更改任何ui

答案 2 :(得分:1)

您需要实例化ProgressDialog:

modalDialog = ProgressDialog.show(this, null, "Please, wait...");