【问题标题】:activity loads xml from server before displaying using TabActivity活动在使用 TabActivity 显示之前从服务器加载 xml
【发布时间】:2011-11-21 01:13:22
【问题描述】:

我使用 TabActivity 和 4 个单独的 Activities - 每个标签一个。

其中一个Activities 是具有自定义ArrayAdapterListView

问题是,当我按 Tab 切换到此视图时,Activity 在视图更改之前加载内容,这似乎在几秒钟内没有任何反应,直到 xml 被加载并且解析等。

我已经找了一个例子,但这是我的第一个 Android 应用程序,我很难理解流程。

谁能给我一些代码,让我在后台线程加载内容时立即更改视图(我可以通知用户内容正在加载)

谢谢

编辑 - 我正在从现有的 iOS 应用程序移植代码 - 我无法更好地阐明问题,因为我没有意识到在这种情况下如何阻止 UI 线程,并且由于现有的代码和截止日期我不想过多地改变结构。

在看到您的代码 Jennifer 之前,我已经缩小了问题的范围,但这是我使用的解决方案,所以我会将您的解决方案标记为正确。

如果它对其他人有帮助,我会使用它,我必须将我调用的函数用于触发数据加载到后台线程,然后在该线程完成工作时显示内容

这个类是在 my 中声明的

public class TableView extends ListActivity

这对我来说很难理解,因为以前没有这样做过;)

public class GetContentTask extends AsyncTask<Void, Void, Void> {


    private ProgressDialog pdialog;

    @Override
    protected void onPreExecute(){ 
       super.onPreExecute();
       pdialog = new ProgressDialog(TableView.this);
       pdialog.setTitle(progressDialogTitle);
       pdialog.setMessage(progressDialogMessage);
       pdialog.show();    
    }

    @Override
    protected void onPostExecute(Void result){
       super.onPostExecute(result);
       setUpAndLoadList(); // the function to display the list and fill it with content
       pdialog.dismiss();
    }


    @Override
    protected Void doInBackground(Void... params) {
        doInitialLoad(); // The function to load any xml data from server
        return null;
    }
 }

【问题讨论】:

  • “如何将它附加到 ArrayAdapter 和返回的内容”是什么意思

标签: android android-layout android-asynctask android-tabactivity


【解决方案1】:

您可以使用进度对话框(可以通知用户内容正在加载)

ProgressDialog dialog;

private class XMLOperation extends AsyncTask<String, Void, String> {

/*
     * (non-Javadoc)
     * 
     * @see android.os.AsyncTask#onPreExecute()
     */
    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

        System.out.println("onPreExecute");

        dialog= ProgressDialog.show(mContext, "", "Loading Content....");
              dialog.setCancelable(false);


    }




        @Override
    protected String doInBackground(String... urls) {

            //do your Background task

    }




protected void onPostExecute(String result) {   //dismiss dialog
        try {
if(dialog.isShowing()){
        dialog.dismiss();
        }



        } catch (Exception exception) {
        dialog.dismiss();
        }
        }

【讨论】:

  • 谢谢 Jennifer,我喜欢对 dialog.isShowing() 的检查
【解决方案2】:

使用 AsyncTask,或(可能)使用单独的线程。

http://developer.android.com/reference/android/os/AsyncTask.html

我也会投入 2 美分并说不要使用 TabActivity。只要有你自己的按钮,看起来像标签,但这对这个主题并不重要。

【讨论】:

  • 感谢您的回答,我希望有一些示例代码,我已经查看了链接,但不确定如何将其附加到 ArrayAdapter 以及返回的内容
  • 回复:代码。我会建议你(邮政编码)。在这里瞎飞。
猜你喜欢
  • 1970-01-01
  • 2019-07-31
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多