0

HTTPClient を使用して、AsyncTask を使用して Web サイトの HTML コードを取得し、そのコードをメインのアクティビティに戻そうとしています。

私はそれを行う(しようとする)ためにこのコードを使用しました:

public class AsyncTaskGet extends AsyncTask<String, String, String>{
    String result;
    InputStream in;

    protected String doInBackground(String... params) {

        try
        {
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpRequest  = new HttpGet("http://www.google.fr");
        HttpResponse response = httpClient.execute(httpRequest);

        try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(null, result), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }

            if (response != null) {
                in = response.getEntity().getContent(); 
            }
            in.close();
            result = sb.toString();
        }catch (Exception e) {
            Log.e("log_tag", "Error converting result " + e.toString());
        }
    }catch(IOException e){
        e.printStackTrace();
    }   
        return result;
    }   


       @Override
        protected void onPostExecute(String result) {
    //Here is one of my problem, I don't know how to get the returned value result as a string.           
        }    
}

これは私の AsyncTaskGet です。無駄な試行を何度も試みたため、この部分を除くメイン アクティビティのすべてのコードを消去しました。

new AsyncTaskGet().execute();

基本的に、私がやりたいことは、メイン アクティビティの結果を文字列として取得し、TextView に表示することです。今のところ、アプリをシンプルにして、AsyncTasks の使用の基本を理解できるようにしたいと考えています。インターネットの接続性などはチェックしませんでした。マニフェストにインターネットを使用するためのアクセス許可を追加します (明らかに

(これは私の最初のアプリの 1 つなので、少し甘やかしてください)

最後にもう 1 つ、英語が下手なことをお許しください。残念ながら、私は英語のネイティブ スピーカーではありません。

よろしくお願いします!

心から :)

4

2 に答える 2

4

最も簡単な方法は、コンストラクターを介して呼び出し元のアクティビティを AsyncTask に渡し、結果をアクティビティ自体のパラメーターとして受け取るメソッドを作成することです。

private Activity mActivity;

public AsyncTaskGet(Activity activity) {
    mActivity = activity;
}

protected void onPostExecute(String result) {
    mActivity.takeItBack(result);           
}

いくつかの制限があります。現在のコードは、AsyncTask と Activity の間の 1 対 1 の関係で機能するだけです。つまり、プライベート メンバー変数の型は、呼び出し元のアクティビティでなければなりません。インターフェイスを実装する必要がない場合は、次のようにします。

// interface
public interface AsyncTaskCallback {
    void takeItBack(String result);
}

// activity
public MyActivity implements AsyncTaskCallback {
    @Override
    public void takeItBack(String result) {
        // do something
    }
}

// AsyncTask
public class AsyncTaskGet extends AsyncTask<String, String, String> {
    private AsyncTaskCallback mCallback;

    public AsyncTaskGet(AsyncTaskCallback callback) {
        mCallback= callback;
    }

    protected void onPostExecute(String result) {
        mCallback.takeItBack(result);           
    }
}
于 2013-01-16T23:51:28.680 に答える
2

すでに結果をonPostExecute()として渡していStringます。あなたAsyncTaskがあなたの内部クラスである場合、Activity結果をあなたのフィールド変数に設定できますActivityActivityそれ以外の場合は、 fromで関数を呼び出してonPostExecute()、データで必要なことを行うことができます。

また、あなたの下手な英語はまったく悪くありません:)

于 2013-01-16T23:46:26.467 に答える