Android不会显示布局

时间:2011-08-25 15:36:54

标签: android xml layout

我最近发现,由于我的应用程序从几个URL中提取了大量数据,因此加载主要布局需要大约3-7秒。因此,我创建了一个名为“loading”的布局来显示,这只是一个TextView,它表示“请等待数据收集......”。但是,当我运行我的应用程序时,它不会显示“加载”布局。它只是变黑了一段时间,就像以前一样,然后转到主要布局。我也试过清理项目,但它仍然这样做。这是我的Main.java的一部分:

@Override
public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.loading);
    populateArray();
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Set up click listeners for all buttons
    View v1 = findViewById(R.id.continueButton);
    v1.setOnClickListener(this);

    View v2 = findViewById(R.id.colorCheck);
    v2.setOnClickListener(this);

    View v3 = findViewById(R.id.terms);
    v3.setOnClickListener(this);
}

populateArray();是提取互联网所有信息的方法。所以,我想,“为什么不告诉它立即将内容视图设置为'加载',让它运行populateArray();,然后显示主要布局?”显然,我必须在这里遗漏一些东西。有什么想法吗?

=============================================== ===========================

编辑:我尝试过使用AsyncTask,但是我已经关闭了。我也得到一个警告说AsyncTask类从未使用过。这是我的代码:

P.S。 ProgressDialog dialog;是一个全球定义。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        dialog = ProgressDialog.show(this, "",
                "Please wait while data is collected...", true);

        // Set up click listeners for all buttons
        View v1 = findViewById(R.id.continueButton);
        v1.setOnClickListener(this);

        View v2 = findViewById(R.id.colorCheck);
        v2.setOnClickListener(this);

        View v3 = findViewById(R.id.terms);
        v3.setOnClickListener(this);
    }

和...

    private class LoadData extends AsyncTask <String[][], String, String> {
        @Override
        protected String doInBackground(String[][]... voidThisArray) {
            String voidThisString = null;
            populateArray();
            return voidThisString;
        }

        @Override
        protected void onPostExecute(String voidThisString) {
            setContentView(R.layout.main);
            dialog.dismiss();
        }

    }

我会给你关闭力的LogCat,但由于某种原因,LogCat没有显示任何东西......

3 个答案:

答案 0 :(得分:3)

您希望首先使用an AsyncTask:创建一个显示加载消息的ProgressDialog。然后AsyncTask将在后台收集所有数据。

希望有所帮助。

private class Task extends AsyncTask<Void,Integer, Void> {
    private ProgressDialog dia;

    @Override protected void onPreExecute() {
        dia = new ProgressDialog(MyContext.this);
        dia.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dia.setMessage("Loading. Please wait...");
        dia.setCancelable(false);
        dia.show();

                // Set up preserver download stuff
        }

    @Override protected Void doInBackground(Void... voids) {
        // perform server download stuff
    }

    @Override public void onProgressUpdate(Integer... prog) {
        if (prog == null)
            return;
        dia.setProgress(prog[0]);
    }

    @Override  protected void onPostExecute(Void voids) {
        // Do any post op stuff
        dia.cancel();
    }
}

答案 1 :(得分:2)

您应该看到this页面,了解有关线程的信息。基本上,如果您的应用程序要执行任何长时间运行的操作,您需要它在一个线程中。您的UI已锁定,因为您在UI线程上执行此操作。

就进度更新而言,我个人使用ProgressDialog来显示发生的事情,尽管您可以构建一个自定义视图来表明这一点。

答案 2 :(得分:2)

查看AsyncTask并执行

populateArray();

在AsyncTask的doInBackground方法中。

并致电

setContentView

只有使用onPreExecute和AsyncTask的onPostExecute方法才能显示加载