onCreate()
中的我的活动执行需要一些时间的长时间计算。
在同一个onCreate()
中,我致电setContentView()
来设置活动的外观。
关键在于,由于执行上述计算需要一段时间,因此活动的屏幕只会在很长时间后加载。
请问,关于如何避免这种情况的任何建议?
我尝试在setContentView()
中调用onCreate()
并在onResume()
中开始计算,但同样只在最后加载了“活动”屏幕。
答案 0 :(得分:2)
如果所有计算都需要很长时间才能执行,那么您的UI将被“锁定”并且不会更新。
您需要在AsyncTask
中完成所有长期工作AsyncTask可以正确,轻松地使用UI线程。此类允许执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。
答案 1 :(得分:2)
在开始初始化视图之前调用onCreate方法中的setContentView(layoutID),在onCreate方法中调用setContentView之后创建AsyncTask并启动AsyncTask线程。下面给出的东西
onCreate(....){
--
--
setContentView(layoutID);
---
--
new asynchTask(); // load your ui in AsyncTask by creating an inner class in your activity by extending AsyncTask class
}
的教程
答案 2 :(得分:2)
你必须实现AsyncTask
public class AsyncTaskActivity extends Activity implements OnClickListener {
Button btn;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button) findViewById(R.id.button1);.
//because we implement OnClickListener we only have to pass "this" (much easier)
btn.setOnClickListener(this);
}
public void onClick(View view){
//detect the view that was "clicked"
switch(view.getId())
{
case R.id.button1:
new LongOperation().execute("");
break;
}
}
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed"); // txt.setText(result);
//might want to change "executed" for the returned string passed into onPostExecute() but that is upto you
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(Void... values) {
}
}