android - AsyncTask get() 有时会卡住

标签 android android-asynctask

我有一个简单的类来处理 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 "";
        }
}

最佳答案

AsyncTask.get(long timeout, TimeUnit unit);

如有必要,最多等待给定时间计算完成,然后检索其结果。因此它会阻塞 UI

test.get(30000, TimeUnit.MILLISECONDS);

这将使您的主线程等待 AsyncTask 的结果最多 30000 毫秒。

关于android - AsyncTask get() 有时会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12196227/

相关文章:

java - 保存序列化的 ArrayList 在 Android 中抛出 NotSerializableException

java - 我如何从服务器获取和设置android中的API(从服务器获取int值)?如何绑定(bind)和实现

android - Android 中的 RxJava 异步任务

java - 从 httppost 响应下载 zip 文件并将其保存为 ANDROID 中的二进制数据

android - Gallery 和 Camera-taken-photo 的 URI/URL 路径不同

java - 将 XMPP 协议(protocol)合并到 Android 应用程序中

java - Calendar.getInstance() 给了我错误的时间取决于我问的时候

Android - Kotlin : return value in async fun

java - 仅在 Activity 未显示时显示通知

android - python 和 (android) adb shell