0

REST API를 사용하여 목록을 채우는 Android 앱이 있습니다.AsyncTask with REST API

AsyncTask를 사용하여 API를 가져 오려고하지만 작동 방식을 이해하는 데 문제가 있습니다. NetworkOnMainThreadError를 피하기 위해 백그라운드에서 API 객체를 만들고 있지만 null 객체에서 호출되는 createItems() 메소드로 연결됩니다.

백그라운드에서 API 개체를 만들고 OnCreate에서 계속 사용할 수 있습니까? 감사! 여기

내에서 OnCreate() 메소드의 세그먼트이다

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_drawer); 

     createLists(); 
     populateNameLists(); 
     new GetAPITask().execute(); 
     createItems(); 

(...) 
    } 

및 여기 오차 (에 CreateItems()) 일으키는 방법 다음 AsyncTask를 여기

public void createItems() { 
     testString = api.testSession(); 
     itemString = api.getItems(...); 
(...) 
    } 

이다 :

private class GetAPITask extends AsyncTask<String, Integer, String> { 

     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     protected String doInBackground(String... params) { 

      api = new API(getString(R.string.dev_id), getString(R.string.auth_key)); 

      return "API Created"; 
     } 

     protected void onProgressUpdate(Integer... values) { 
      super.onProgressUpdate(values); 
     } 

     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
     } 
    } 

답변

0

AsyncTask를 사용하는 것은 백그라운드에서 데이터를 얻는 것이고 일단 데이터를 얻으면 뷰를 채 웁니다. 그것. onPostExecute 내부에서 처리해야하는 데이터를 사용할 준비가되면보기를 채우는 메소드 만 실행합니다. 이처럼 수행해야합니다

protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     createItems(); 
} 
0

귀하의 AsyncTask를이 외부 클래스

private static class GetAPITask extends AsyncTask<String, Integer, String> { 

에 서명이 당신이 코드와 변수에 액세스 할 수있는 중지됩니다

변화에 대한 참조가 클래스 내부. https://stackoverflow.com/a/10540669/413127


다음 당신이의 api 변수 외부에 액세스 할 수 없습니다 의미 : 당신의 혼란을 여기

더 많은 설명을 유발 - 당신은 AsyncTask를의 api 외부에 액세스 할 수 어떻게

ASyncTask (올바른)입니다. 그런 다음 코드를 백그라운드 스레드로 옮기고 ASyncTask가 반환 할 대상을 결정해야합니다. 현재로서는 String을 반환합니다.

당신은 콜백 해당 문자열에 액세스 할 수 있습니다

:

private static class GetAPITask extends AsyncTask<String, Integer, String> { 

     interface Callback { 
      void onComplete(String text); 
     } 

     private final API api; 
     private final Callback callback; 

     GetAPITask(API api, Callback callback) { 
      this.api = api; 
      this.callback = callback; 
     } 

     protected String doInBackground(String... params) { 
      return "API Created"; 
     } 

     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      callback.onComplete(result); 
     } 
    } 

그리고 다음과 같이 사용 : 당신이 볼 수 있듯이, 지금은 정리되어

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_drawer); 

    //createLists(); 
    //populateNameLists(); 
    API api = new API(getString(R.string.dev_id), getString(R.string.auth_key)); 
    new GetAPITask(api, new GetAPITask.Callback() { 
      @Override 
      public void onSuccess(String result) { 
       Log.d("TUT", "My asynctask returned: " + result); 
      } 
    }).execute(); 
    //createItems(); 

    (...) 
} 

, 당신의 AsyncTask를이 아니다 아무것도 수행하지 않고 문자열을 doInBackground() 메서드로 반환합니다. 여기에서 실행하고자하는 코드를 옮겨야합니다! (즉,같은 createItems


) doInBackground() 안에 뭔가 이동 : 당신이 당신의 AsyncTask를 여러 문자열을 반환하려면

 protected String doInBackground(String... params) { 
      String testString = api.testSession(); 
      String itemString = api.getItems(...); 
      (...)    

      return testString; 
     } 

     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      callback.onComplete(result); 
     } 

을, 당신은 데이터 클래스를 만들고 해당를 반환해야합니다.