3

と通信するアプリを構築していAPIます。すべての API 通信コードとデータ処理を 1 つの API にまとめて、APIclassを使用するたびに、すべてのロジックが存在する中心的な場所を確保できるようにします。

事は、HTTPRequests使用することを強くお勧めしますAsyncTasksAsyncTask例に示すように、クラス全体を派生させてを作成します。

私のクラスは、HTTP 呼び出しのために非同期にする必要がある関数で構成されています。他はしません。

私の質問: API クラス全体を AsyncTask から派生させるだけですか、それとも API クラスを通常部分と非同期部分にさらに分割しますか?

4

3 に答える 3

2

Create an interface with 2 kind of methods, one that don't execute on other threads and other that do. Make async methods accept a callback object to be notified when they're done. Example:

public interface MyAPI {
 //--this method runs an AsyncTask and calls supplied Callback object's methods when done
 public void fetchRemoteData(String input, Callback c);

 //--this method just processes input string locally and returns it
 public String doStuff(String input);
}

public interface Callback{
  public void onDone(int doneWhatCode, String result);
}

Implementation:

public class MyWebAPI implements MyAPI{
  @Override
  public void fetchRemoteData(String input, final Callback c){
        AsyncTask<String,Void,String> task = new AsyncTask<String,Void,String>(){

            @Override
            protected String doInBackground(String... strings) {
                String i = strings[0];

                //---connect, fetch data ----
                String result = "result";

                return result;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                c.onDone(1,s);
            }
        };

      task.execute("new Input url");
    }

  @Override
  public String doStuff(String input){
    return input.replace("i","o");
  }
}

Let your API be exposed by these interfaces. This way you can keep it all together and also keep actual implementation separated for future changes.

于 2013-02-15T09:02:09.027 に答える
0

ここでのポイントは、「このクラスを UI スレッドから使​​用することはできない」ということです。その後、AsyncTask を作成します。サービスがあり、そこからいくつかの API メソッドを呼び出したいとしたら? サービス スレッドから AsyncTask を呼び出すことはできません。
UI から呼び出したい場合は、このクラスをそのままにして、AsyncTask にラップします。

編集: これは、既存の機能を AsyncTask にラップする例です。

private class GetAuthorisationUrlTask extends AsyncTask<String, Void, String>
{
    private OAuthBuilder oAuthBuilder;
    private GetAuthorisationUrlTaskCallback callback;

    public GetAuthorisationUrlTask(Context context, OAuthBuilder oAuthBuilder, GetAuthorisationUrlTaskCallback callback)
    {
        this.oAuthBuilder = oAuthBuilder;
        this.callback = callback;
    }

    @Override
    protected String doInBackground(String... params)
    {
        try
        {
            Log.i(TAG, "Getting authorization url...");
            return oAuthBuilder.getAuthorizationUrl();
        }
        catch (Exception e)
        {
            Log.e(TAG, "Unable to get OAuth authorization url: " + e, e);
            return null;
        }
    }

    @Override
    protected void onPostExecute(String result)
    {
        Log.i(TAG, "Authorisation url: " + result);
        if (result == null)
            Toast.makeText(getApplicationContext(), "Error getting authorization url.", Toast.LENGTH_SHORT).show();
        else
            callback.urlCreated(result);
    }

    static interface GetAuthorisationUrlTaskCallback
    {
        void urlCreated(String url);
    }
}

これで、AsyncTask を呼び出して、結果の準備ができたときにコールバックを取得できます。

GetAuthorisationUrlTask getAuthorisationUrlTask = new GetAuthorisationUrlTask(this,
        new GetAuthorisationUrlTaskCallback()
        {
            @Override
            public void urlCreated(String url)
            {
                webview.loadUrl(url);
            }
        });
getAuthorisationUrlTask.execute();

定型コードがたくさんあることは知っていますが、UI をビジネス クラスのロジックから完全に切り離します。ここでは 1 つのタスクしか実行しませんが、それを拡張してより汎用的にし、新しいクラスを導入することなくより多くのことを実行するのは簡単です。

于 2013-02-15T09:01:06.860 に答える
0

それはあなた次第です。すべてを処理し、投稿の更新などを行うことができますAsyncTaskが、直接関係のない多くの異なる要求である場合は、それらを分離します。AsyncTasksユースケースを考えて、それに基づいて別のものに分けるのが良いアプローチかもしれません。

ユース ケース ベースのアプローチの例を挙げると、次のようになります。

  • メインは初期化のためにActivity最初AsyncTaskに起動します。
  • ユーザーがログインをクリックするか、他の実行時間の長い操作を開始します --> 2 番目に開始しAsyncTaskます。

次に、どちらの場合でも、古いクラスが残っていますがAsyncTasks、古いクラスに実装されている API を呼び出します。

于 2013-02-15T09:03:13.057 に答える