如何在加载数据前呈现视图

时间:2017-01-20 23:48:58

标签: android android-asynctask android-view

我开发了一个与云服务器通信的应用程序。现在我想在加载数据时添加一些反馈。例如,用户单击“获取数据”按钮以加载数据,按钮文本应更改为“加载”。加载数据后,文本将再次成为“获取数据”。

然而,第一次尝试不起作用,我做了一些研究,这是因为视图在任务完成之前不会呈现。 (我使用AsyncTask加载数据)。我发现在线解决方案通知我应该在onPreExecute()和onPostExecute()方法中呈现视图,所以我尝试了这种方法。好吧,它也不起作用。

似乎有一个约束强制渲染工作只在所有AsyncTask完成后完成。

有人可以开导我吗?它困扰了我很长一段时间。

1 个答案:

答案 0 :(得分:0)

虽然我建议对云API操作进行Retrofit,但如果你想使用AsyncTask,那就没关系了。我还建议使用ProgressBar / Dialog,而不仅仅是更新一些文本。

  

在任务完成之前,视图不会呈现

...不明确

  

我发现在线解决方案通知我应该在onPreExecute()和onPostExecute()方法中呈现视图,所以我尝试了这种方法。好吧,它既不起作用

是的,这样可行,因此您应该显示您尝试过的内容

  

似乎有一个约束强制渲染工作只在所有AsyncTask完成后完成

是的,存在一个限制,即您无法在UI线程之外更新UI。这就是onPreExecute和onPostExecute存在的原因。

我可以保证这些方法有效。

enter image description here

public class ButtonActivity extends android.support.v7.app.AppCompatActivity implements View.OnClickListener {

    private Button button;
    private ProgressBar pg;

    @Override
    protected void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(...);

        button = (Button) findViewById(...);
        button.setOnClickListener(this);

        pg = (ProgressBar) findViewById(...);
        setLoading(false);
    }

    private void setLoading(boolean loading) {
        button.setText(loading ? "loading" : "get data");
        pg.setVisibility(loading ? View.VISIBLE : View.GONE);
    }

    @Override
    public void onClick(View v) {
        new BackgroundTask().execute();
    }

    private class BackgroundTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            setLoading(true);
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                // some long operation
                Thread.sleep(3000);
            } catch (InterruptedException e) { }

            return null;
        }


        @Override
        public void onPostExecute(Void result) {
            setLoading(false);
        }
    }
}