2014-02-09 3 views
1

JSON 응답을 받아야하는 메소드가 있습니다. 는 여기있다 :android asyncTask을 이해할 수 없습니다.

public HttpResponse getJson() { 
     HttpResponse response = null; 
     try {   
       HttpClient client = new DefaultHttpClient(); 
       HttpGet request = new HttpGet(); 
       request.setURI(new URI("https://mysite.com/android/showJson.php")); 
       response = client.execute(request); 
      } catch (URISyntaxException e) { 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return response; 
     } 

showJson.php 반환이 : ["item 1","item 2"]

의 I 직면하고있어 문제 그것은 오류 던지고 때문에 나는, onCreate의 내부 getJson를 호출 할 수 있다는 것입니다 : android.os.NetworkOnMainThreadException

onCreate 안에 내 메서드를 호출하기 위해 내 메서드가 별도 클래스 안에 있어야한다는 것을 알았지 만 관리 할 수 ​​없습니다. 나는 정말로 울게 될 것이고, 나는 asyncTask의 구문을 이해할 수 없다! 나는 작은 것을 놓치고 있다는 것을 압니다. 그러나 나는 초심자로 보지 못합니다. 나는 몇 가지 테스트 값으로 배열을 작성하고 listView로 전달하지만, 지금은 getJson의 항목을 작성해야 해요

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_top_jokes);  

     getJson(); 
     String[] myStringArray = {"a","b","c","a","b","c","a","b","c","a","b","c","a","b","c","a","b","c"}; 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, myStringArray); 

     ListView listView = (ListView) findViewById(R.id.topJokesList); 
     listView.setAdapter(adapter); 

     listView.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(), 
       ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 

: 여기

onCreate 방법이다.

답변

1

AsyncTask이 필요하며 doInBackground 메소드에서 요청하십시오.
응답을 받으면 onPostExecute 메서드를 사용하여 주 스레드 (Ui)에 알릴 필요가 있습니다.

private class JsonTaskTask extends AsyncTask<Void, Void, Void> { 
private HttpResponse response; 
protected Long doInBackground(Void... params) { 
    reponse = getJson(); 
    return null; 
} 

protected void onPostExecute(Void params) { 
    //Show Your Listview 
} 

public HttpResponse getJson() { 
    HttpResponse response = null; 
    try {   
      HttpClient client = new DefaultHttpClient(); 
      HttpGet request = new HttpGet(); 
      request.setURI(new URI("https://mysite.com/android/showJson.php")); 
      response = client.execute(request); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return response; 
    } 
    } 

은 UI를 통지하고 ListView에 당신이 리스너 인터페이스를 사용할 수 있습니다를 업데이트하려면

new JsonTaskTask().execute(void, void, void); 


통해 AsyncTask를 호출합니다. 예 : 나는 this 답에 나와있는 것처럼.

+0

매개 변수없이 간단한 execute()로 호출 할 수 있습니다. –

+0

네, 맞습니다. 그러나 어쩌면 나중에 그는 그것에 uri를 전달하고 있습니다. 그런 다음 그는 논쟁이 필요합니다. – EarlOfEgo

+0

고마워요. 알아내는 데 시간이 좀 걸렸지 만 지금은 효과가 있습니다! :) – chility

1

asynctasks를 사용하는 방법에 대한 예는 많이있다, 여기에 하나입니다

AsyncTask Android example

이 basicly 당신이 AsyncTask를 확장하고, (귀하의 경우 getJson();)를 백그라운드 작업을 추가 할 것이다 새로운 클래스를 추가해야 doInBackground. onCreate에서 AsyncTask 인스턴스에 execute()를 호출합니다. AsyncTask가 끝나면 UI 스레드에서 실행되는 onPostExecute가 실행됩니다. 여기서 UI를 업데이트 할 수 있습니다.

onCreate에서 빈 배열로 목록보기에 목록 어댑터를 설정할 수 있습니다. onPostExecute 안에 새로운 값으로 ListView를 업데이트해야합니다. 실제로 doInBackground 내에서 json을 구문 분석하고 ListView를 업데이트하기 위해 onPostExecute에 사용될 ArrayList를 참조하여 fron을 반환하는 것이 좋습니다.

관련 문제