27

ユーザーが特定のボタンをクリックしたときに HTTP 要求を実行する (具体的には FogBugz API を呼び出す) アプリケーションがあります。現在、アプリケーションの起動時にサービスを作成し、そのサービスでさまざまなメソッドを呼び出してリクエストを完了しています。ただし、これを行うと、UI スレッドで通常のハングが発生します。私は AsyncTask を見てきましたが、それが私が達成したいことをするかどうかはわかりません。HTTP 要求が返す XML を即座に解析する必要があるため、このデータを UI スレッドに返すことができるプロセスが必要です。ASyncTask はこれを達成できますか、それとも他の方法がありますか?

    public static InputStream makeRequest(String httpRequest)
    {
        In a separate thread, run HTTP Request, get back and process, return inputstream
    }

このメソッドは、HttpRequests を実行するために他のいくつかによって呼び出されます。入力ストリームが返されると、他のメソッドが特定の情報を解析します。

4

2 に答える 2

79

それを行う最も簡単な方法は、次のようなことをすることです

//Body of your click handler
Thread thread = new Thread(new Runnable(){
  @Override
  public void run(){
    //code to do the HTTP request
  }
});
thread.start();

これにより、メソッド内のコードがrun()新しい実行スレッドで実行されます。個人的には使用したことがありませんが、必要に応じて非同期タスクを調べることができます。これは、物事を成し遂げるための迅速かつ簡単な方法です。

情報を返すことに関しては、特定のスレッドのメッセージ キューを効果的に設定し、特定のコードの実行を引き起こすメッセージをそれに渡すことができるHandler オブジェクトを使用します。これを行う必要があるのは、Android では UI スレッド以外のスレッドが実際の UI を更新できないためです。

それはあなたの質問に答えていますか?私の最初のパスがあなたの問題のすべてに完全に対処していないことは知っています。

編集基本的に、あなたがすることは、Activity好きなようにハンドラーオブジェクトを定義することです

private Handler handler_ = new Handler(){
    @Override
    public void handleMessage(Message msg){

    }

};

intまた、ハンドラーに何をすべきかを伝えるのに役立つ静的定数も作成します。基本的にこれらを使用して、いくつかの異なるタイプのメッセージをハンドラーの 1 つのインスタンスに渡すことができます。返されるメッセージが 1 つだけの場合は、心配する必要はありません。

例えば

private static final int UPDATE_UI = 1;

呼び出すハンドラにメッセージを送信するには

handler_.sendMessage(Message.obtain(handler_, UPDATE_UI, inputStreamInstance));

ハンドラーから:

private Handler handler_ = new Handler(){
    @Override
public void handleMessage(Message msg){
    switch(msg.what){
            case UPDATE_UI:
            InputStream is = (InputStream)msg.obj;
            //do what you need to with the InputStream
            break;
        }
    }

};

または、inputStreamInstance がオブジェクトに追加されているMessage場合は、任意のオブジェクトを渡すことができるので、それをある種のコンテナー オブジェクトなどに解析したい場合は、それも同様に行うことができます。ハンドラー内からそのオブジェクトにキャストするだけです。

于 2010-08-02T19:59:39.947 に答える
5

AsyncTask を使用してみてください。詳細については、このリンクに移動してください。

private class SyncIncoData extends AsyncTask<String, String, String> {
    ProgressBar pb;
    ProgressBar pbar;

    @Override
    protected String doInBackground(String... urls) {
        for (int i = 0; i <= 100; i++) {
            publishProgress(i);
        }
        return null;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();

        pb = (ProgressBar) findViewById(R.id.progressBarsync4);
        pb.setVisibility(View.VISIBLE);

    }

    @Override
    protected void onPostExecute(String result) {

        pb = (ProgressBar) findViewById(R.id.progressBarsync4);
        pb.setVisibility(View.INVISIBLE);

    }

    @Override
    protected void onProgressUpdate(String... values) {
        pbar = (ProgressBar) findViewById(R.id.progressBarpbar);
        pbar.setProgress(Integer.parseInt(values[0]));
        super.onProgressUpdate(values);
    }
}

内部にhttpリクエスト用のプログラムを書くdoinbackgroud()

于 2012-06-21T09:07:19.247 に答える