Android 当活动开始时启动线程
我有下面的代码Android 当活动开始时启动线程,android,multithreading,Android,Multithreading,我有下面的代码 public class StartGameActivity extends BaseActivity { public TextView txtCustomerCount; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.st
public class StartGameActivity extends BaseActivity {
public TextView txtCustomerCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_game);
this.txtCustomerCount = (TextView) findViewById(R.id.txtCustomerCount);
testThread();
}
public void testThread(){
Runnable runnable = new Runnable() {
@Override
public void run() {
int count = 0;
boolean stop = false;
while(!stop){
txtCustomerCount.setText(Integer.toString(count));
fakework(2000);
count++;
if(count > 99){
stop = true;
}
}
}
};
new Thread(runnable).start();
}
public void fakework(int lasts){
try {
Thread.sleep(lasts);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
现在,我想在执行onCreate()
时启动线程,但上面的代码返回如下错误
07-10 17:20:20.046:E/AndroidRuntime(6247):
android.app.SuperNotCalledException:活动
{yens.alisa.menu/yens.alisa.menu.StartGameActivity}未调用
到super.onStart()为止
我哪里出错了?如果你能进一步解释,因为我刚刚开始学习android。谢谢。鉴于堆栈跟踪,唯一可能导致它的原因是
BaseActivity
没有调用super.onCreate()
从主线程以外的线程更新用户界面元素违反了安卓开发的关键规则。
因此,为了更新用户界面,有必要为线程实现一个处理程序或使用AsyncTask
虽然这可能不是问题所在。检查BaseActivity,如@blackbelt Suggered。您不能直接从后台线程访问视图元素。 另外,如果您在程序中使用
AsynTask
,则只有OnpreExecute
和OnPostExecute
方法可以直接访问在UI线程上运行的元素。doInBackground
方法在单独的线程上运行
在您的情况下,在Asyntask
的doInBackground
中,您可以使用--
但是,错误日志与问题无关。是否添加了onStart()?Stacktrace显然与问题无关:(我对没有读取显式错误消息投了反对票。@C4stor这只是显示的错误日志,您可能需要证据的屏幕截图?我认为您没有发布整个跟踪。另外,请查看您的代码:
txtCustomerCount.setText(Integer.toString(count))
应该在UI线程上调用,如果活动本身完成,您也应该退出循环。@Mahan:我相信错误就在这里。我不相信它与您显示的代码部分或任何类型的多线程问题有关。blackbelt很可能是正确的
txtCustomerCount.post(new Runnable() {
@Override
public void run() {
txtCustomerCount.setText(Integer.toString(count));
}
});