我有一个简单的类来处理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 "";
}
}
答案 0 :(得分:1)
文档本身提到了,
如果需要等待计算完成,然后检索 结果。
因此,此方法将阻止UI,直到您的AsyncTask运行。您只需更新在UI线程上执行的onPostExecute()
上的UI。
如果您有兴趣从AsyncTask返回一些值,您可以使用自己的侦听器,可能是BroadCastReceiver或Interface。 Here is an example from my github
答案 1 :(得分:1)
AsyncTask.get(long timeout, TimeUnit unit);
如果需要,最多在给定时间内等待计算完成,然后检索其结果。因此它会阻止UI 。
test.get(30000, TimeUnit.MILLISECONDS);
这将使您的主线程等待AsyncTask的结果最多30000毫秒。
答案 2 :(得分:0)
您是否尝试过更常见的AsyncTask方法?
我的意思是Lalit指出,得到适当函数的结果:
在doInBackground上返回结果
return rezultat;
并在MakeRequest
的onPostExecute上处理它 protected void onPostExecute(String result) {
}
不要忘记更改AsyncTask签名
class MakeRequest extends AsyncTask<String,Integer,String>{