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 本身提到,

公开最终结果获取()

如有必要,等待计算完成,然后检索其结果。

因此,此方法将阻止 UI,直到您的 AsyncTask 正在运行。您可以简单地更新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 回答