2

http リクエストを処理する単純なクラスがあります。Android 3.1 以降、このタスクは別のスレッドで実行する必要があるため、リクエストが完了するまで待機する get を使用する次のスレッド ブロッキング クラスを作成しました。

初めて動作しますが、その後は常にタイムアウトになるか、アプリケーションがフリーズします。これが私のコードです:

class MakeRequest extends AsyncTask<String,Integer,Void>
{

    @Override
    protected Void doInBackground(String... params) {
        DefaultHttpClient cli = new DefaultHttpClient();
        try {
            String url = params[0].replace(" ", "%20");
            HttpResponse resp = cli.execute(new HttpGet(url));
            BufferedReader read = new BufferedReader(new InputStreamReader(resp.getEntity().getContent()));
            String tmp = "",rezultat = "";
            setResult("");

            while ((tmp = read.readLine()) != null)
            {
                rezultat = rezultat + tmp;
            }
            setResult(rezultat);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            setResult("");
            return null;
        }
        return null;
    }



}

static public String req(Context ctx,String url,boolean want_resp)
{

    if (isOnline(ctx))
    {
        HttpRequester cc = new HttpRequester();
        MakeRequest test = cc.new MakeRequest();
        test.execute(url);
        if (want_resp)
        {
            try {
                test.get(30000, TimeUnit.MILLISECONDS);
            }
            catch (Exception e)
            {
                return "FAIL";
            }
            return result;
        }
        else return "OK";
    }
    else 
        {
        Toast.makeText(ctx, "Internet connection required", Toast.LENGTH_SHORT).show();
        setResult("");
        return "";
        }
}
4

3 に答える 3

2

Docs自体は、

public final Result get ()

必要に応じて計算が完了するまで待機し、その結果を取得します。

したがって、このメソッドは、AsyncTask が実行されるまで UI をブロックします。onPostExecute()UIスレッドで実行されるUIを簡単に更新できます。

AsyncTask から何らかの値を返すことに興味がある場合は、BroadCastReceiver または Interface などの独自のリスナーを使用できます。これが私のgithubの例です

于 2012-08-30T11:54:44.010 に答える
2
AsyncTask.get(long timeout, TimeUnit unit);

必要に応じて、計算が完了するまで指定された時間だけ待機し、その結果を取得します。そのため、UI がブロックされます

test.get(30000, TimeUnit.MILLISECONDS);

これにより、メイン スレッドは AsyncTask の結果を最大 30000 ミリ秒待機します。

于 2012-08-30T11:56:35.720 に答える
1

より一般的なAsyncTaskアプローチを試しましたか?

Lalit が指摘するように、適切な関数で結果を取得します。

doInBackground で結果を返します

return rezultat;

MakeRequest の onPostExecute で処理します

 protected void onPostExecute(String result) {

 }

AsyncTask 署名を変更することを忘れないでください

class MakeRequest extends AsyncTask<String,Integer,String>{
于 2012-08-30T12:00:17.530 に答える