我开发了一个与云服务器通信的应用程序。现在我想在加载数据时添加一些反馈。例如,用户单击“获取数据”按钮以加载数据,按钮文本应更改为“加载”。加载数据后,文本将再次成为“获取数据”。
然而,第一次尝试不起作用,我做了一些研究,这是因为视图在任务完成之前不会呈现。 (我使用AsyncTask加载数据)。我发现在线解决方案通知我应该在onPreExecute()和onPostExecute()方法中呈现视图,所以我尝试了这种方法。好吧,它也不起作用。
似乎有一个约束强制渲染工作只在所有AsyncTask完成后完成。
有人可以开导我吗?它困扰了我很长一段时间。
答案 0 :(得分:0)
虽然我建议对云API操作进行Retrofit,但如果你想使用AsyncTask,那就没关系了。我还建议使用ProgressBar / Dialog,而不仅仅是更新一些文本。
在任务完成之前,视图不会呈现
...不明确
我发现在线解决方案通知我应该在onPreExecute()和onPostExecute()方法中呈现视图,所以我尝试了这种方法。好吧,它既不起作用
是的,这样可行,因此您应该显示您尝试过的内容。
似乎有一个约束强制渲染工作只在所有AsyncTask完成后完成
是的,存在一个限制,即您无法在UI线程之外更新UI。这就是onPreExecute和onPostExecute存在的原因。
我可以保证这些方法有效。
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);
}
}
}