只创建了原始线程

时间:2015-02-06 11:47:35

标签: android

我不明白只有创建视图层次结构的原始线程的含义。请有人帮我解决这个问题。

谢谢 ................................

This is my class

public class DashboardActivity extends Activity {
    UserFunctions userFunctions;
    Button btnLogout;
    ListView mainListView;
    SessionManager session;
    private ArrayAdapter<String> listAdapter ;  
    public static String name;
    public static String email;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            setContentView(R.layout.dashboard);
            session = new SessionManager(getApplicationContext());
            btnLogout = (Button) findViewById(R.id.button_logout);
            mainListView = (ListView) findViewById( R.id.listView_groups_prof);  

            new Connection().execute();     
    }

      private class Connection extends AsyncTask {

            @Override
            protected Object doInBackground(Object... arg0) {
                connect();
                return null;
            }

            protected void onPostExecute(Void result) {
                //connect();
            } 


      }

      private String  connect() {

          if(session.isLoggedIn()){
          HashMap<String, String> user = session.getUserDetails();            
          String idv = user.get(SessionManager.KEY_ID).toString();            
          String typev = user.get(SessionManager.KEY_TYPE).toString();

          try {
              URL url;
            String myurl= "http://trouvermoi.com/android_login_api/src/controller/GroupeProfesseurController.php?tag=getgroupesprofesseur&idp="+idv;
              System.out.println("URL : " + myurl);

            url = new URL(myurl);

              HttpURLConnection connection = (HttpURLConnection) url.openConnection();
              connection.connect();
              InputStream inputStream = connection.getInputStream();

              String data = InputStreamOperations.InputStreamToString(inputStream);          

             System.out.println("data :      " + data);
              JSONObject jsonObj = new JSONObject(data);
              JSONArray empInfo = jsonObj.getJSONArray("emp_info");
              final String[] values = new String[empInfo.length()];
              ArrayAdapter<String> itemsAdapter = 
                    new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 1);                
              for(int i = 0; i < empInfo.length(); i++){
                  JSONObject obj = empInfo.getJSONObject(i);
                  String groupe = obj.getString("groupe");
                  String professeur = obj.getString("professeur");
                  values[i]=groupe;
              }
              mainListView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , values));
              mainListView.setOnItemClickListener(new OnItemClickListener() {
                  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                      // When clicked, show a toast with the TextView text

                    //Toast.makeText(getApplicationContext(), values[position].toString(),
                       //   Toast.LENGTH_SHORT).show();


                       //When clicked evrywhere, open prologue.java
                      Intent intent = new Intent(DashboardActivity.this, Elevespargroupe.class);
                        intent.putExtra("id",values[position].toString());
                        startActivity(intent);
                }
              });


            } catch (Exception e) {
                  e.printStackTrace();
              }

          btnLogout.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                session.logoutUser();
                Intent in =  new Intent(DashboardActivity.this,LoginActivity.class);
                    startActivity(in);
            }
        });

     }else{
        Intent login = new Intent(getApplicationContext(), LoginActivity.class);
        startActivity(login);
      }

          return null;

        }

}

这是我的LogCat

02-06 11:33:28.795: I/System.out(2358): data :      {"emp_info":[{"id":"1","groupe":"1","professeur":"1"},{"id":"2","groupe":"2","professeur":"1"}]}
02-06 11:33:28.805: W/System.err(2358): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-06 11:33:28.815: W/System.err(2358):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
02-06 11:33:28.815: W/System.err(2358):     at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:854)
02-06 11:33:28.815: W/System.err(2358):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:4077)
02-06 11:33:28.815: W/System.err(2358):     at android.view.View.invalidate(View.java:10379)
02-06 11:33:28.815: W/System.err(2358):     at android.view.View.invalidate(View.java:10334)
02-06 11:33:28.825: W/System.err(2358):     at android.widget.AbsListView.resetList(AbsListView.java:1840)
02-06 11:33:28.825: W/System.err(2358):     at android.widget.ListView.resetList(ListView.java:504)
02-06 11:33:28.825: W/System.err(2358):     at android.widget.ListView.setAdapter(ListView.java:444)
02-06 11:33:28.825: W/System.err(2358):     at com.androidhive.pushnotifications.DashboardActivity.connect(DashboardActivity.java:103)
02-06 11:33:28.835: W/System.err(2358):     at com.androidhive.pushnotifications.DashboardActivity.access$0(DashboardActivity.java:71)
02-06 11:33:28.835: W/System.err(2358):     at com.androidhive.pushnotifications.DashboardActivity$Connection.doInBackground(DashboardActivity.java:60)
02-06 11:33:28.835: W/System.err(2358):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-06 11:33:28.846: W/System.err(2358):     at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-06 11:33:28.846: W/System.err(2358):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-06 11:33:28.855: W/System.err(2358):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-06 11:33:28.855: W/System.err(2358):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-06 11:33:28.865: W/System.err(2358):     at java.lang.Thread.run(Thread.java:856)

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您正在AsyncTask的doInBackground方法中设置适配器,该方法在后台线程的非UI线程上运行,因此您无法从非UI线程触摸UI组件。

要处理这个问题,你的UI工作在AsyncTask的onPostExecute中,它会在doInBackground完成后自动调用

答案 1 :(得分:0)

用于访问不同线程调用活动的方法runOnUIThread()

将您的连接方法更改为以下方法:

private String  connect() {

        if(session.isLoggedIn()){
            HashMap<String, String> user = session.getUserDetails();
            String idv = user.get(SessionManager.KEY_ID).toString();
            String typev = user.get(SessionManager.KEY_TYPE).toString();

            try {
                URL url;
                String myurl= "http://trouvermoi.com/android_login_api/src/controller/GroupeProfesseurController.php?tag=getgroupesprofesseur&idp="+idv;
                System.out.println("URL : " + myurl);

                url = new URL(myurl);

                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.connect();
                InputStream inputStream = connection.getInputStream();

                String data = InputStreamOperations.InputStreamToString(inputStream);

                System.out.println("data :      " + data);
                JSONObject jsonObj = new JSONObject(data);
                JSONArray empInfo = jsonObj.getJSONArray("emp_info");
                final String[] values = new String[empInfo.length()];
                ArrayAdapter<String> itemsAdapter =
                        new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 1);
                for(int i = 0; i < empInfo.length(); i++){
                    JSONObject obj = empInfo.getJSONObject(i);
                    String groupe = obj.getString("groupe");
                    String professeur = obj.getString("professeur");
                    values[i]=groupe;
                }

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mainListView.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , values));
                        mainListView.setOnItemClickListener(new OnItemClickListener() {
                            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                // When clicked, show a toast with the TextView text

                                //Toast.makeText(getApplicationContext(), values[position].toString(),
                                //   Toast.LENGTH_SHORT).show();


                                //When clicked evrywhere, open prologue.java
                                Intent intent = new Intent(DashboardActivity.this, Elevespargroupe.class);
                                intent.putExtra("id",values[position].toString());
                                startActivity(intent);
                            }
                        });
                    }
                });

            } catch (Exception e) {
                e.printStackTrace();
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    btnLogout.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View arg0) {
                            session.logoutUser();
                            Intent in =  new Intent(DashboardActivity.this,LoginActivity.class);
                            startActivity(in);
                        }
                    });
                }
            });



        }else{
            Intent login = new Intent(getApplicationContext(), LoginActivity.class);
            startActivity(login);
        }

        return null;

}