- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个 AsyncTask Activity ,它们的唯一职责是在 UI 线程上执行 AsyncTask。其中之一效果很好,显示进度条,并更新进度条消息。这是针对我的 SearchActivity,它实际上是一个搜索 Activity ,其中包含用于声明搜索 Activity 的 Google 搜索元数据。我创建了一个 AsyncTask 的克隆,只更改了 doInBackground 代码,还克隆了 SearchActivity 并将其命名为 browseActivity。
我在一个类中启动 BrowseActivity 以在单击某个项目时扩展 listView。我打算发生的事情是让 AsyncTask 的 onPreExecute 代码像 SearchActivity 那样在 ListView Activity 和 ResultActivity 之间显示一个进度条,ListView 将在 ActivityResult 上启动。正在调用 onPreExcute 代码,但从不显示 ProgressBar。 (我以为我在 UI 线程上正确地运行了它?)
这里是 BrowseActivity:
AsyncTask<String, String, ArrayList<SearchResult>> browseTask;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String genreExtra = getIntent().getStringExtra(Genre.BUNDLE_TAG);
if(genreExtra!=null){
genre = Genre.getgenreFromExtra(genreExtra);
}
String categoryExtra = getIntent().getStringExtra(Category.BUNDLE_TAG);
if(categoryExtra!=null){
this.category = Category.getCategoryFromExtra(categoryExtra);
}
final Connector connector = GlobalVars.getCurrentConnector();
Thread browseThread = new Thread(){
@Override
public void run() {
try {
browseTask = connector.browse(BrowseActivity.this, category, genre, 1);
browseTask.execute("");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
runOnUiThread(browseThread);
ArrayList<SearchResult> result = null;
try {
result = browseTask.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Bundle queryBundle = new Bundle();
queryBundle.putSerializable(SERIALIZABLE_KEY, result);
Intent i = new Intent();
i.putExtra(BUNDLE_KEY, queryBundle); //Put in our browse results
i.putExtra(Category.BUNDLE_TAG, category.putExtra()); //put our category in return intent
i.putExtra(Genre.BUNDLE_TAG, genre.putExtra()); //put our genre in return intent
setResult(RESULT_OK, i);
finish();
}
这是启动 browseActivity 的 CategoryActivity(扩展 ListActivity) Activity :
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
super.onListItemClick(l, v, position, id);
Intent i = new Intent(CategorySelectionView.this, BrowseActivity.class);
final Category[] categories = Category.values();
i.putExtra(Category.BUNDLE_TAG, categories[position].putExtra());
i.putExtra(Genre.BUNDLE_TAG, genre.putExtra());
CategorySelectionView.this.startActivityForResult(i, BrowseActivity.RESULT_REQUEST_CODE);
}
// Listen for results.
protected void onActivityResult(int requestCode, int resultCode, Intent data){
// See which child activity is calling us back.
switch (requestCode) {
case BrowseActivity.RESULT_REQUEST_CODE:
// This is the standard resultCode that is sent back if the
// activity crashed or didn't doesn't supply an explicit result.
if (resultCode == RESULT_CANCELED){
}
else {
ArrayList<SearchResult> recentQueryResults = (ArrayList<SearchResult>)data.getBundleExtra(
BrowseActivity.BUNDLE_KEY).getSerializable(BrowseActivity.SERIALIZABLE_KEY);
GlobalVars.setRecentQueryResults(recentQueryResults);
Category category = Category.getCategoryFromExtra(data.getStringExtra(Category.BUNDLE_TAG));
Intent i = new Intent(CategorySelectionView.this, RomListView.class);
i.putExtra(Category.BUNDLE_TAG, category.putExtra());
i.putExtra(Genre.BUNDLE_TAG, genre.putExtra());
startActivity(i);
}
default:
break;
}
}
最佳答案
首先,您不能在主/UI 线程上运行 AsyncTask,这就是重点。当您调用 browseTask.execute()
它会在适当的线程(主线程与后台线程)上调用其方法,而不管调用 runOnUiThread()
.调用runOnUiThread()
您所做的只是将启动它的代码包装在另一个 Runnable
中.我认为这不是您想要的,因为在调用 runOnUiThread()
之后您尝试获取尚未运行的任务的结果。 onCreate()
中的代码在 UI 线程上运行,所以它必须在其他东西可以运行之前完成,即 onPreExecute()
的 AsyncTask
.
您应该做的是创建 AsyncTask
把你目前所有的东西都放在runOnUiThread()
之后在 onPostExecute()
.
关于java - AsyncTask 不显示 onPreExecute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3374159/
我有两个 AsyncTask Activity ,它们的唯一职责是在 UI 线程上执行 AsyncTask。其中之一效果很好,显示进度条,并更新进度条消息。这是针对我的 SearchActivity,
我有一个 AsyncTask,它应该在通过 Internet 上传一些内容时显示进度条。有时它就像一个魅力,有时它不显示任何进度条。这是代码: public class Upload extends
我有一个包含列表的 fragment ,对于这个列表,我希望在加载列表时显示加载图标,然后再显示列表。这是我的列表 fragment 布局,通过在 fragment 的 onCreateView()
所以,我的 AsyncTask 如下: private class AsyncRetriever extends AsyncTask{ ProgressDialog pDialog;
class AddStudent extends AsyncTask { private ProgressDialog pDialog; @Override protected void onPreE
我在 onPreExecute() 中检查互联网连接状态,如果没有互联网连接,它不应该执行 doInBackground() 和 onPostExecute() new getStatus().exe
当 onPreExecute 函数执行时我有一个 AsyncTask,它给我一个异常 ** java.lang.IllegalStateException: View com.android.inte
由于某些原因,没有调用 onPreExecute。代码: protected void onPreExcecute() { hook.createDialog(ticker); } 全类: p
使用 android.os.AsyncTask 时,即使任务通过executeOnExecutor() 发布到单个线程池,onPreExecute() 方法也会异步执行。这是有意的行为吗? Googl
我看到 .get() 是问题所在,但我在没有他的情况下尝试过,但什么也没有。如果可能的话帮助我。 ProgressDialog 在 doInBackground() 之后执行并在运行 onPostEx
volley 中有没有像 AsyncTask 这样的方法? 我在我的应用程序中使用了 volley 库,我想在 volley 中做一些预执行。那么在 AsyncTask 中的 volley lib 广
我得到一个 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prep
我正在使用 Android HoneyComb。我需要并行执行一些任务,我正在使用 AsyncTask 的public final AsyncTask executeOnExecutor (Execu
我使用 AsyncTask 来加载我作为内部类实现的操作。 在 onPreExecute() 中,我显示了一个加载对话框,然后我将其再次隐藏在 onPostExecute() 中。但是对于一些加载操作
异步任务中的代码: @Override protected void onPreExecute() { super.onPreExecute(); Sc
我有 MainActivity.java Activity 类,它在应用程序启动时加载。我在名为 ServerOperation.java 的单独文件中使用 asyncTask 方法。我需要在 asy
我想将 onPreExecute AsyncTask 添加到 SherlockFragment,但它会导致错误。我的代码如下。在 preExecute AsyncTask 上添加对话框的这段代码有什么
在我的自定义 DialogPreference 中,我使用执行 AsyncTask 的自定义 View.onClickListener 覆盖肯定按钮的 onClick 事件。我的类(class)大致如
当 AsyncTask 在 onPreExecute() 中启动时,我试图让 ProgressDialog 出现,在 doInBackground() 中做一些事情,并在 onPostExecute(
我是这个网站的新手。我的 AsyncTask 和我的 android 程序有一个错误...这是我编写的第一个异步任务。 名为 SocialApp.java 的主类 @Override public v
我是一名优秀的程序员,十分优秀!