【问题标题】:Android async task progressbar not loading after returning to activity返回活动后未加载Android异步任务进度条
【发布时间】:2011-11-24 15:46:41
【问题描述】:

我正在使用异步任务在我的列表视图中重新加载数据,并在我的活动中设置一个进度条以显示它正在加载。但问题是,如果我开始一个新活动并返回并且加载未完成,则进度条不会显示。如何设置进度条以继续加载?而且我忘了提一下,在我返回活动后,异步任务也没有刷新我的列表视图。这是我正在使用的代码:

    public class MyCollectionsTask extends AsyncTask <Context, Integer, Void> {
    @Override
    protected Void doInBackground(Context... arrContext) {
        JsonCollection jsonColl = new JsonCollection();
        Log.e("","DO IN BACKGROUND");
        for(int i=0; i<arrContext.length; i++) {
                jsonColl.executeInsert(arrContext[i]);
        }
        return null;
    }
    @Override
    protected void onProgressUpdate(Integer... progress) {
        Log.e("","ON PROGRESS UPDATE");
        for (int i=0; i<progress.length; i++){
            progressBar.setProgress(i);
        }   
    }
    @Override
    protected void onCancelled() {
        Log.e("","ON CANCELLED");
         progressBar.setVisibility(View.GONE);
         sync.setImageResource(R.drawable.sync_icon2);
    } 
    @Override
    protected void onPreExecute() 
    {
        Log.e("","ON PRE EXECUTE");
    }
    @Override
    protected void onPostExecute(Void v) {
        Log.e("","ON POST EXECUTE");
        SystemDatabaseHelper newdbHelper = new SystemDatabaseHelper(MyCollectionList.this, null, 1);
        newdbHelper.initialize(MyCollectionList.this);

        String genresSQLforID = "SELECT DISTINCT g.genre_id AS genreID, gl.title AS Title " +
               "FROM genres AS g, genre_lang AS gl " +
               "WHERE gl.genre_id = g.genre_id AND gl.lang_code ='" + langCode + "'"+" ORDER BY gl.title";
        Cursor genresCursor = newdbHelper.executeSQLQuery(genresSQLforID);
        if (genresCursor.getCount() == 0) {
           genresCursor.close();        
        } else {
           genresCursor.moveToFirst();
           GenID = Integer.parseInt(genresCursor.getString(genresCursor.getColumnIndex("genreID")));
        }
            getCollectionsForGenre(GenID);
        final SharedPreferences isLogged = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = isLogged.edit();
        editor.putBoolean("getProgBarCollection", false);
        editor.commit();
        progressBar.setVisibility(View.GONE);
        sync.setImageResource(R.drawable.sync_icon2);
    }
  }

【问题讨论】:

  • 您以哪种方法运行此任务? onCreate() 还是什么?
  • 我在 onCreate() 中运行它;
  • 我不想每次都运行异步任务,我只想检查它是否正在运行以显示进度条并更新列表视图。
  • 在后台尝试publishProgress()

标签: android android-asynctask


【解决方案1】:

当您从另一个活动返回时,它只是恢复活动,它不会进入 onCreate 方法()。您需要做的是使用 startActivityForResult() 从您的 asyntask 活动开始另一个活动,并在您的 asyntask 活动中覆盖 onActivityResult 方法。 并在 onActivityResult() 中再次执行 asyntask。最好这样做,而不是从 Onresume 中的 asyntask 调用,因为在其他情况下,它也会进入 Onresume,就像按下 Home 键并再次进入一样

【讨论】:

  • 我不想再次运行异步任务。我只想知道当我回到活动时它是否仍在运行,以及它是否正在运行以显示进度条直到它停止,然后刷新列表视图。
  • 但是如果您从进度条显示对话框,它将使 UI 用户无法从屏幕继续前进,直到对话框完成。您应该在 asyntask 的 preExecute 方法和 asyntask 的 postUpdate 方法中启动对话框,您应该关闭对话框
  • 进度条并没有阻塞用户界面,它只是嵌入在操作栏中并在那里旋转。我想要实现的目标是在任务仍在运行时继续旋转它。
  • 您使用 AsyncTask.Status.RUNNING 检查 onActivityResult 中的状态
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多