Android-ProgressBar有一半的时间可以工作

Android-ProgressBar有一半的时间可以工作,android,progress-bar,Android,Progress Bar,我想在加载活动时显示进度条。但是progressbar只能工作一半的时间,当progressbar不工作时,充电时会显示一个黑屏 这是我的任务: class Task extends AsyncTask<String, Integer, Boolean> { @Override protected void onPreExecute() { layout.setVisibility(View.VISIBLE); titre_projet

我想在加载活动时显示进度条。但是progressbar只能工作一半的时间,当progressbar不工作时,充电时会显示一个黑屏

这是我的任务:

class Task extends AsyncTask<String, Integer, Boolean> {
    @Override
    protected void onPreExecute() {
        layout.setVisibility(View.VISIBLE);
        titre_projet.setVisibility(View.GONE);
        description_projet.setVisibility(View.GONE);
        image_projet.setVisibility(View.GONE);
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Boolean result) {
        layout.setVisibility(View.GONE);
        titre_projet.setVisibility(View.VISIBLE);
        description_projet.setVisibility(View.VISIBLE);
        image_projet.setVisibility(View.VISIBLE);
        super.onPostExecute(result);
    }

    @Override
    protected Boolean doInBackground(String... params) {

        try {
            runOnUiThread(new Runnable() {
                public void run() {
                    Intent intent = getIntent();

                    if (intent != null) {
                        searchResultats(intent.getStringExtra(EXTRA_PROJET));
                    }
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
            return null;
        }
    }
以及progressBar的我的XML:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0"
android:toDegrees="360"
android:layout_width="match_parent"
android:layout_height="match_parent">
<shape android:shape="ring" android:innerRadiusRatio="3"
    android:thicknessRatio="8" android:useLevel="false">

    <size android:width="76dip" android:height="76dip" />
    <gradient android:type="sweep" android:useLevel="false"
        android:startColor="#447a29"
        android:endColor="#447a29"
        android:angle="0"
        />
</shape>
</rotate>

当新闻活动开始时,开始获取数据(文章)。在活动的onCreate方法中,启动任务。在任务的doInBackground方法中,获取文章(我假设您需要通过网络获取它)。 任务完成后,在onPostExecute中更新UI

class Task extends AsyncTask<String, Integer, Object> {

    private Activity activity;

    public Task(Activity a){
       activity=a;
    }

    @Override
    protected void onPostExecute(Object article) {
       activity.onArticleFetched(article);
    }

    @Override
    protected Object doInBackground(String... params) {
       Object article = new Article();             
       //Fetch article... may take a few seconds, but you don't care because you are not in the UI thread
       return article;
    }
}
  • 您已经发布了
    drawable
    ,而不是
    layout
    xml。我不知道如何用它来表示进展

  • 请查收
    AsyncTask.doInBackground()
    应用于获取数据(网络、解析和UI线程中禁止的其他内容)。在这里,您需要不时调用
    AsyncTask.publishProgress()
    ,然后系统在UI线程中调用
    AsyncTask.onProgressUpdate()
    。重写
    AsyncTask.onProgressUpdate()
    以在UI中显示进度(将级别设置为进度条或其他内容)

  • 最后,将在UI线程中调用
    AsyncTask.onPostExecute()
    。重写此方法以显示在
    AsyncTask.doInBackground()
    中处理的数据,并根据需要修改视图


  • 如果doInBackground中的所有内容都在UI线程上运行,那么异步任务的意义何在?我添加了IU线程,因为如果没有错误,“只有创建视图层次结构的原始线程才能接触其视图”。是的,如果不在UI线程上,则无法修改视图。但是,AsyncTask类的要点是在另一个线程上运行,以避免阻塞UI线程。例如,每次您要阻止线程(网络调用、文件读取、昂贵的计算)时,请使用AsyncTask。那么,我如何删除RunOnUIThread以运行ProgressBar并运行修改视图的活动?您所说的“当我的活动加载时”是什么意思?你的活动负荷是多少?如果您想向用户显示ProgressBar,只需使用:Ok,我只是了解它是如何工作的!谢谢你,穆奇!
    class Task extends AsyncTask<String, Integer, Object> {
    
        private Activity activity;
    
        public Task(Activity a){
           activity=a;
        }
    
        @Override
        protected void onPostExecute(Object article) {
           activity.onArticleFetched(article);
        }
    
        @Override
        protected Object doInBackground(String... params) {
           Object article = new Article();             
           //Fetch article... may take a few seconds, but you don't care because you are not in the UI thread
           return article;
        }
    }
    
    class NewsActivity extends Activity {
    
         @Override
         public void onCreate(Bundle a){
           super.onCreate(a);
           //do some stuff.
           task.execute();
           progressBar.setVisibility(View.VISIBLE);
         }
    
         public void onArticleFetched(Object article){
           progressBar.setVisibility(View.GONE);
           //updateUI
         }
    }