android - 使用 setContentView 加载布局时显示 ProgressDialog

标签 android multithreading android-activity android-asynctask progressdialog

这是我的场景:我有一个打开另一个 Activity 的登录屏幕。在 Activity 中,我只有:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);
}

布局有点重,因为它是由一些 fragment 组成的,加载大约需要 1.5 秒。 现在,如何在 setContentView 完成布局膨胀时显示 ProgressDialog?我已经尝试通过将 setContentView 放在 doInBackground 中来使用 AsyncTask,但是当然不能这样做,因为 UI 可以从更新仅限 UI 线程。 所以我需要在 UI 线程中调用 setContentView,但是我必须在哪里显示/关闭 ProgressDialog

感谢您的帮助。

兄弟。

编辑:我遵循了@JohnBoker 之前的建议,这是我现在的代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_empty_layout);
    new ContentSetterTask().execute("");
}

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

    public ProgressDialog prgDlg;

    @Override
    protected void onPreExecute() {
        android.os.Debug.waitForDebugger();
        prgDlg = ProgressDialog.show(MultiPaneActivity.this, "", "Loading...", true);

    }

@Override
protected Void doInBackground(String... args) {
    android.os.Debug.waitForDebugger();
    ViewGroup rootView = (ViewGroup)findViewById(R.id.emptyLayout);
    LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View inflated = inflater.inflate(R.layout.activity_details, rootView);
    return null;
}

@Override
protected void onPostExecute(Void arg) {
    android.os.Debug.waitForDebugger();
    if (prgDlg.isShowing())
        prgDlg.dismiss();
    }
  }
}

View inflated = inflater.inflate(R.layout.activity_details, rootView);

给我错误:

06-27 16:47:24.010:   
ERROR/AndroidRuntime(8830): Caused by:android.view.ViewRoot$CalledFromWrongThreadException: 
Only the original thread that created a view hierarchy can touch its views.

最佳答案

我决定在这里为 future 的读者做一个完整的回答。

在这个问题上花了几个小时后,我意识到这个问题是我正在尝试做两件事:

  1. 扩充布局,这是一个 需要进行的操作 设计的 UI 线程。
  2. 显示一个对话框(ProgressDialog, 实际上,但这并没有改变 结果),这可以从 仅 UI 线程,因为服务 无法显示任何对话框。

因此,由于这两个调用都是从 UI 线程进行的(onCreate 或 AsyncTask 没有区别,它仍然是 UI 线程),第一个阻止第二个正确显示。 底线是:目前在 Android 中这个问题无法解决。让我们希望我们可以获得一些更好的 API 来与 UI 交互,因为我们得到的 API 有点烂。

我将通过更改布局并使其更轻(如果可能的话!)来解决这个问题。 谢谢大家!

关于android - 使用 setContentView 加载布局时显示 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6493534/

相关文章:

android - 一个简单的客户端-服务器 - Android<>PC

c# - 打开另一个应用程序并传入 url

java - Checkstyle 能否验证字符串值等于类或文件名?

C# Lock ("string") 不适用于动态参数?

java - 在 Android 中使用 SQLite 未将数据插入表中

java - 尝试在 Activity 之间切换,不知道为什么这不起作用?

android - 使用 Branch.io 时我应该检查 root 吗?

java - RecyclerView 没有 LayoutManager android.support.v7.widget.RecyclerView

java - 在它的关键部分执行的线程可以在 Java 中被抢占吗?

java - 使用ThreadPool的多线程UDP服务器