Java 安卓:按钮onClick在3秒后反应
我正在为UAC的一个项目编写一个小应用程序,在onClick事件后显示ProgressDialog时遇到了麻烦 基本上,当在我的活动中调用onClick时,我启动一个异步任务,在onPreExecute中启动progressDialog,在onPostExecute中再次取消它Java 安卓:按钮onClick在3秒后反应,java,android,Java,Android,我正在为UAC的一个项目编写一个小应用程序,在onClick事件后显示ProgressDialog时遇到了麻烦 基本上,当在我的活动中调用onClick时,我启动一个异步任务,在onPreExecute中启动progressDialog,在onPostExecute中再次取消它 btnSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v
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);
}
});
btnSearch.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
ArrayList配方=空;
试一试{
ParsedElement x=新的ParsedElement(v.getContext());
Object[]params=新对象[2];
params[0]=txtSearch.getText().toString();
参数[1]=v;
recipes=(ArrayList)x.execute(params.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
Intent switchToDisplayPage=新的Intent(SearchActivity.this、UIGenerator.class);
Bundle params=新Bundle();
参数putParcelableArrayList(“配方”,配方);
切换到DisplayPage.putExtras(参数);
startActivity(切换到显示页面);
}
});
我遇到的问题是,单击“nothing”(无)按钮大约3秒钟。我已经看过安卓显示器了,当我点击这个按钮时,发现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;
背景五;
公共语法删除(上下文v){
这个,v=v;
}
受保护的void onPreExecute(){
super.onPreExecute();
progressDialog=新建progressDialog(v);
progressDialog.setTitle(“下载”);
setMessage(“正在加载配方…”);
progressDialog.setUndeterminate(false);
progressDialog.show();
}
@凌驾
受保护对象doInBackground(对象[]参数){
字符串搜索字符串=(字符串)参数[0];
视图v=(视图)参数[1];
ArrayList recipes=新的ArrayList();
试一试{
System.out.println(System.currentTimeMillis());
ArrayList single=新的ArrayList();
添加(新URL(Constants.baseSearchURL+searchString));
documentmaindocument=(Downloaders.getDocumentFromURL(single)).get(0);
Elements mainElements=mainDocument。选择(“div.img\u wrap img[src]”;
ArrayList URL=新的ArrayList();
对于(inti=1;i我发现了问题。
是这样的:
recipes = (ArrayList<Recipe>) x.execute(params).get();
recipes=(ArrayList)x.execute(params.get();
虽然我启动了一个异步任务,但主线程正在等待任务的返回值。这就是主线程被阻塞的原因
我没有将值返回给activity,而是执行了任务并在doInBackground中继续
希望这对某人有帮助