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を())を引き起こす方法であって、ここで

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

はAsyncTaskです:

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> { 

変更の署名を持っているこれは、コードと変数にアクセスできることを停止しますクラス内。あなたがASyncTaskのapi外にアクセスしてもらう方法です

-

もっとあなたの混乱を引き起こしてのここでの説明:あなたは外api変数にアクセスすることはできませんことを意味しhttps://stackoverflow.com/a/10540669/413127


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()メソッド内でStringを返す以外は何もしません。ここで実行したいコードを移動する必要があります!すなわち、 (すなわち、あなたは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); 
     } 

createItems

doInBackground()内部

にのようなものを移動します。