java - AsyncTask 不显示 onPreExecute

标签 java android multithreading android-asynctask ui-thread

我有两个 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/

相关文章:

java - Java 中破坏逆变边界的安全解决方法?

java - Spring 和编程式事务管理的连接池问题

android - 如何存储连续位置数据的数据

android - 我在哪里可以找到适用于 Android/iPhone 的免费中文手写识别引擎?

java - 删除在循环Java中的arraylist中创建的对象

java - java中不可修改的列表

java - 为什么我可以通过 undefined object 的接口(interface)访问对象的方法?

android - 位图占用大量内存

java - Concurrent HashMap Null key 和并发级别

c - 无法确定简单多线程程序中的错误