Android:按钮onClick在3秒后作出反应

时间:2017-02-26 18:51:18

标签: java android

我正在为我的UAC的一个项目编写一个小应用程序,我遇到了在onClick事件后显示ProgressDialog的麻烦。

基本上当我在我的活动中调用onClick时,我启动一个AsyncTask,在onPreExecute中我启动progressDialog,在onPostExecute中我再次关闭它。

btnSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ArrayList<Recipe> recipes = null;
            try {
                ParsedElement x = new ParsedElement(v.getContext());
                Object[] params = new Object[2];
                params[0] = txtSearch.getText().toString();
                params[1] = v;
                recipes = (ArrayList<Recipe>) x.execute(params).get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }

            Intent switchToDisplayPage = new Intent(SearchActivity.this, UIGenerator.class);
            Bundle params = new Bundle();
            params.putParcelableArrayList("recipes", recipes);
            switchToDisplayPage.putExtras(params);
            startActivity(switchToDisplayPage);
        }
    });

我遇到的问题是点击“无”按钮约3秒钟。我已经看过Android监视器,发现单击按钮时CPU使用率最高可达40%。

ProgressDialog progressDialog;
Context v;

public ParsedElement(Context v) {
    this.v = v;

}

protected void onPreExecute() {
    super.onPreExecute();
    progressDialog = new ProgressDialog(v);
    progressDialog.setTitle("Downloading");
    progressDialog.setMessage("Recipes are loading...");
    progressDialog.setIndeterminate(false);
    progressDialog.show();

}


@Override
protected Object doInBackground(Object[] params) {


    String searchString = (String) params[0];
    View v = (View) params[1];

    ArrayList<Recipe> recipes = new ArrayList<>();
    try {
        System.out.println(System.currentTimeMillis());
        ArrayList<URL> single = new ArrayList<>();
        single.add(new URL(Constants.baseSearchURL + searchString));
        Document mainDocument = (Downloaders.getDocumentFromURL(single)).get(0);
        Elements mainElements = mainDocument.select("div.img_wrap img[src]");
        ArrayList<URL> urls = new ArrayList<>();


        for (int i = 1; i <= 10; i++) {
            urls.add(new URL(Constants.baseSearchURL + searchString +
                    Constants.pageString + Integer.toString(i)));
        }

        ArrayList<Document> tempDocument = Downloaders.getDocumentFromURL(urls);

        for (Document docu : tempDocument) {
            Elements tempElement = docu.select("div.img_wrap img[src]");
            for (Element a : tempElement) {
                mainElements.add(a);
            }
        }

        for (Element link : mainElements) {
            recipes.add(new Recipe(link.attr("title"), link.attr("abs:src")));
        }

    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return recipes;
}

@Override
protected void onPostExecute(Object aVoid) {

    super.onPostExecute(aVoid);
    progressDialog.dismiss();
}

在这种情况下,ProgressDialog不会显示。我读了很多线程,基本上说“我在主线程中做得太多了”显然在我的情况下,我没有做任何重的事情。

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。 就在这一行:

recipes = (ArrayList<Recipe>) x.execute(params).get();

虽然我启动了AsyncTask,但主线程正在等待Task的返回值。这就是主线程被阻止的原因。

我没有将值返回给活动,而是执行了任务,然后继续在doInBackground中运行。

希望这有助于某人