2014-01-24 7 views
-1

Я пытаюсь получить данные JSON из PHP файлаКак решить проблему с mainthread

public void connect(){ 
    System.out.println("%%%%%%%%%%%%%%%%%1"); 
    Thread t = new Thread(){ 

     @Override 
     public void run() { 

    try { 

     System.out.println("%%%%%%%%%%%%%%%%%2"); 
     HttpParams params = new BasicHttpParams(); 
     HttpConnectionParams.setSoTimeout(params, 0); 
     HttpClient httpClient = new DefaultHttpClient(params); 
     String urlString = "http://url"; 
     //prepare the HTTP GET call 
     HttpGet httpget = new HttpGet(urlString); 
     //get the response entity 
     HttpEntity entity = httpClient.execute(httpget).getEntity(); 
     System.out.println("%%%%%%%%%%%%%%%%%3"); 
     if (entity != null) { 
      //get the response content as a string 
      String response = EntityUtils.toString(entity); 
      //consume the entity 
      entity.consumeContent(); 

      // When HttpClient instance is no longer needed, shut down the connection manager to ensure immediate deallocation of all system resources 
      httpClient.getConnectionManager().shutdown(); 

      //return the JSON response 

      JSONArray jsonarray = new JSONArray(response); 
      JSONObject jb =(JSONObject) jsonarray.getJSONObject(0); 
      String name= jb.getString("name"); 
      String punkt = jb.getString("punktezahl"); 

      //String name = jsonarray.getString("name"); 
      System.out.println("HEEEEEEEEEEEEEEEEEEEEEEEEEEEE" + name); 
      fuehrender.setText(name); 
      punkte.setText(punkt); 
       } 



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

}; 
t.start(); 
} 

Если я, как это я получаю сообщение, что только оригинальные темы, которые создали иерархию вида может коснуться его точки зрения.

Так из-за этим сообщение об ошибке я попытался это так:

public void connect(){ 
    System.out.println("%%%%%%%%%%%%%%%%%1"); 
    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 

    try { 

     System.out.println("%%%%%%%%%%%%%%%%%2"); 
     HttpParams params = new BasicHttpParams(); 
     HttpConnectionParams.setSoTimeout(params, 0); 
     HttpClient httpClient = new DefaultHttpClient(params); 
     String urlString = "http://url"; 
     //prepare the HTTP GET call 
     HttpGet httpget = new HttpGet(urlString); 
     //get the response entity 
     HttpEntity entity = httpClient.execute(httpget).getEntity(); 
     System.out.println("%%%%%%%%%%%%%%%%%3"); 
     if (entity != null) { 
      //get the response content as a string 
      String response = EntityUtils.toString(entity); 
      //consume the entity 
      entity.consumeContent(); 

      // When HttpClient instance is no longer needed, shut down the connection manager to ensure immediate deallocation of all system resources 
      httpClient.getConnectionManager().shutdown(); 

      //return the JSON response 

      JSONArray jsonarray = new JSONArray(response); 
      JSONObject jb =(JSONObject) jsonarray.getJSONObject(0); 
      String name= jb.getString("name"); 
      String punkt = jb.getString("punktezahl"); 

      //String name = jsonarray.getString("name"); 
      System.out.println("HEEEEEEEEEEEEEEEEEEEEEEEEEEEE" + name); 
      fuehrender.setText(name); 
      punkte.setText(punkt); 
       } 



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

}); 

} 
} 

Теперь, я получаю сообщение об ошибке в NetworkOnMainThread .. Как разорвать эти думы цикла?

+0

место вашей примерки поймать блок в AsyncTask. –

+0

Ответ короткий: вы не можете создавать сети ** и ** ui в той же теме. – njzk2

ответ

1

У вас есть runOnUiThread. Убери это. Он должен использоваться только для обновления ui, а не для запроса http get.

Использование AsyncTask - лучший вариант. Сделайте запрос http в doInBackground и проанализируйте также ответ. Вы можете вернуть результат в doInbackground, который является параметром для onPostExecute.

Итак, вы можете обновить ui в onPostExecute, который вызывается на нити ui.

http://developer.android.com/reference/android/os/AsyncTask.html

Пример:

Для вызова

new TheTask().execute(); // in ui thread 

Сделать AsyncTask внутренний класс активности

class TheTask extends AsyncTask<Void,Void,String> 
{ 

    @Override 
    protected String doInBackground(Void... params1) { 
     String response = null; 
      try { 
       HttpParams params = new BasicHttpParams(); 
       HttpConnectionParams.setSoTimeout(params, 0); 
       HttpClient httpClient = new DefaultHttpClient(params); 
       String urlString = "http://url"; 
       HttpGet httpget = new HttpGet(urlString); 
       HttpEntity entity = httpClient.execute(httpget).getEntity(); 
       response = EntityUtils.toString(entity); 
       httpClient.getConnectionManager().shutdown(); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
     return response; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     JSONArray jsonarray = new JSONArray(result; 
     JSONObject jb =(JSONObject) jsonarray.getJSONObject(0); 
     String name= jb.getString("name"); 
     String punkt = jb.getString("punktezahl"); 
     fuehrender.setText(name); 
     punkte.setText(punkt); 
    } 

} 
+0

Если я это сделаю, я получаю исключение NetworkOnMainThread! – user896692

+0

@ user896692 вам нужно использовать thread или AsyncTask. AsyncTask проще. – Raghunandan

+1

Возможно, потому, что вы вызываете 'connect()' из 'UI'. Вызовите его из фона 'Thread'. Но я согласен, [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html) намного проще – codeMagic