デリゲートを使用してAsyncTaskからデータを取得する

みなさんこんにちは!



初心者のAndroidライター向けに、ちょっとしたトリックを紹介したいと思います。 このトリックは世界と同じくらい古いもので、以前は何度も使用していましたが、Androidでの私の主な仕事は何の関係もありませんでしたので、過去数年間忘れていましたが、先日、それを緊急に覚えなければなりませんでした。





Webサービスからデータを受信し、それをリストの形式で画面に表示するという、恥をかかせるのは簡単なタスクであるマイクロアプリケーションを作成する必要がありました。 それは簡単だと思われるでしょうか? しかし、1つの「but」があります。より正確には、これらの「buts」もいくつかあります。



第1に、実装に無期限の時間がかかる可能性のあるすべての操作(およびネットワークのすべての操作を含む)は、個別のスレッドで実行する必要があります。 Android SDKは、この問題に対する少なくとも2つのソリューションを提供します。そのうちの1つ(そして私の意見では最も正しい)はAsyncTaskです。 したがって、これは明らかです。 どうぞ



2番目の最も重要な問題は、ネットワークでの作業結果をメインストリームに戻して画面に表示する方法です。 さて、それを理解しましょう... AsyncTaskについて私たちが何を知っているのでしょうか。 そして、 onPostExecuteメソッドメインスレッドで実行されることを知っています! この事実により、少なくとも2つの問題の解決策が得られます。 回数-グラフィカルコントロール(私の場合はListView)をパラメーターを使用してAsyncTaskに転送し、 onPostExecuteのデータを入力するだけです。 このオプションは、私たちの問題を解決する例として、インターネットで最もよく見られます。 2つ目-より柔軟なオプション-デリゲートの使用です。 もちろん、ここにはいくつかのオプションもありますが、そのうちの1つだけを検討します。



言葉から行動に移る時です!



したがって、まず最初に、メソッドが1つしかないインターフェースを作成します。

public interface GetDataListener { void onGetDataComplete(JSONArray result); }
      
      







次に、アクティビティにこのインターフェイスを実装します。

 public class MyActivity extends Activity implements GetDataListener { private ListView list; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); list = (ListView) findViewById(R.id.lvData); } public void onGetDataComplete(JSONArray responce) { ... //    ListView ... } }
      
      







それでは、AsyncTaskの時間です。

 public class GetData extends AsyncTask<Void, Void, JSONArray> { private final static String SERVICE_URI = "http://moi.service.com/service.php"; private GetDataListener listener; GetData(GetDataListener listener) { this.listener = listener; } protected void onPostExecute(JSONArray result) { listener.onGetDataComplete(result); } protected JSONArray doInBackground(Void... params) { return CallService(); } private JSONArray CallService() { JSONArray records = null; ... //      ... return records; } }
      
      





コンストラクターに注意してください! ここで、デリゲートを取得して保存します。



これでほぼすべての準備が整いました。アクティビティからメカニズムを起動するだけです。



 new GetData(this).execute();
      
      







ご覧のとおり、革新的でクリーンでシンプルなものはありません。 誰かの時間を節約したいです。



All Articles