【问题标题】:android.view.ViewRootImpl$CalledFromWrongThreadException : Only the original thread that created a view hierarchy can touch its viewsandroid.view.ViewRootImpl$CalledFromWrongThreadException :只有创建视图层次结构的原始线程才能接触其视图
【发布时间】:2014-01-09 07:32:37
【问题描述】:

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

【问题讨论】:

标签: android android-asynctask


【解决方案1】:

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

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

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

应该在onPostExecute

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多