0

Androidでアプリケーションを開発しています。アプリケーションは、HTTP 要求を特定の Web サーバーに送信できます。その投稿リクエストは非同期で実行する必要があるため、ジョブを実行するためのスレッドを作成します。しかし、スレッドの最後に呼び出されるコールバックが必要で、`post` メソッドを呼び出すスレッドから呼び出される必要があります。

私のpost方法は次のようになります。

interface EndCallback
{
    public void Success(String response);
    public void Fail(Exception e);
}

public void post(final String url, final List<NameValuePair> data, EndCallback callback)
{
    Thread t = Thread.currentThread();
    (new Thread()
    {
        public void run()
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            try
            {
                httppost.setEntity(new UrlEncodedFormEntity(data));
                HttpResponse r = httpclient.execute(httppost);

                HttpEntity en = r.getEntity();
                String response = EntityUtils.toString(en);

                //I want to call callback.Success(response)
                //here from thread t
            } 
            catch (Exception ex)
            {
                //And I want to call callback.Fail(ex)
                //here from thread t
            }
        }
    }).start();
}
4

2 に答える 2

2

ハンドラーを使用することをお勧めします。ハンドラーは、GUIスレッドにリクエストを送信するために使用されます。

正常に処理するには、次のコードを使用します。

final Handler successHandler = new Handler()
{
    @Override
    public void handleMessage(Message message)
    {
        callback.Success(response);
    }
};

successHandler.sendEmptyMessage(0);
于 2012-05-19T16:33:16.850 に答える
1

Androidで新しいスレッドを作成することは、ほとんどのアプリケーションではお勧めできませんこれは、AsyncTaskに最適な場所のようです。スレッドの作成を手動で管理しなくても、スレッドを切り替えるメソッドが組み込まれています。

同様の状況で私が使用したアプローチの1つは、タスクをenum可能な成功状態の1つと組み合わせることです。

class HttpPostTask extends AsyncTask<Void, Void, ResponseStatus> {

    @Override
    protected ResponseStatus doInBackground( Void... params ){

        try {
            // do your HTTP stuff
            return ResponseStatus.SUCCESS;
        } catch( Exception e ){
            return ResponseStatus.FAILURE;
        }

    }

    @Override
    protected void onPostExecute( ResponseStatus status ){
        switch( status ){
        case SUCCESS:
            // run your success callback
            break;
        case FAILURE:
            // run the failure callback
            break;
        }
    }

}

enum ResponseStatus {
    SUCCESS,
    FAILURE
}

このdoInBackgroundメソッドは、OSによって管理される別のスレッドで実行されます。そのスレッドが終了onPostExecuteすると、タスクを開始したスレッド(通常はUIスレッド)で実行されます。

コールバックオブジェクトを設定する必要がある場合は、HttpPostTaskにコンストラクターを追加し、必要な初期化を実行するだけです。クライアントコードは、タスクを作成して実行するだけで済みます。

new HttpPostTask().execute();

パラメータをに渡すこともできますexecute()。これは、クラスシグネチャの最初のジェネリック型の可変数の引数を受け入れます。のparams変数は、doInBackground実行に渡されたものの配列であり、すべて同じタイプです。

にパラメータを渡すexecuteと、たとえば、複数のURLに投稿する場合に便利です。ほとんどの依存関係では、コンストラクターでそれらを設定するのが最も簡単なアプローチです。

于 2012-05-19T16:34:59.980 に答える