当前位置: 首页 > 知识库问答 >
问题:

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

曹华荣
2023-03-14

我正在开发一个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);
}

异步任务:

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个答案

富涛
2023-03-14

无法从后台线程更新用户界面。doInbackground是在后台线程上调用的。Ui应该在用户界面线程上更新。

doInbackground中获取数据表单数据库返回结果并相应地在onPostExecute中更新用户界面。

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

应在onPostExecute中

 类似资料: