android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图

时间:2014-01-09 07:32:37

标签: android android-asynctask

我正在开发一个Android应用程序,我使用Eclipse作为IDE,我的数据库是MySQL。我有以下问题。当我尝试通过AsynTask从数据库中获取数据时,我有下面显示的错误。

android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy 
can touch its views

的活动:

@Override
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);
   asyn=new MyAsyncTask();

   tvtexto=(TextView)findViewById(R.id.tvtextoMa);
   context = getApplicationContext();
   eventos = new ArrayList<Eventos>();
   eventosAdapter = new EventosAdapter(context, R.layout.filae, eventos);
   eventos=new ArrayList<Eventos>();
   asyn.execute();
   listView = (ListView)findViewById(R.id.ListView01Ma);
}

的AsyncTask:

public class MyAsyncTask extends AsyncTask<Void, Void, Void> 
{
   @Override
   protected Void doInBackground(Void... arg0) 
   {
      eventos=(ArrayList<Eventos>) BDEventos.getDatosEventos();
      for(Eventos n:eventos){
         eventosAdapter.add(n);
      }
      eventosAdapter.notifyDataSetChanged();
      listView.setAdapter(eventosAdapter);
      return null;
   }
}

1 个答案:

答案 0 :(得分:0)

无法从后台线程更新ui。 `doInbackground在后台线程上调用。 Ui应该在ui线程上更新。

doInbackground返回结果中获取您的数据表单数据库,并在onPostExecute中相应地更新ui。

eventosAdapter.notifyDataSetChanged();
listView.setAdapter(eventosAdapter);

应该在onPostExecute