静态AsyncTask ProgressBar

时间:2018-01-03 14:56:49

标签: android android-asynctask static

很抱歉,这似乎是一个基本问题。我已经更新了Android Studio并注意到我的AsyncTasks上的一些内存泄漏警告说我应该让它们保持静态。我已经使它们静态但似乎无法制作像List,ProgressBar,ImageView这样的工作而不会得到相同的内存泄漏警告。无论我尝试哪种方式,似乎无法获胜。我想我的问题是:

  1. AsyncTasks应该是静态的吗?官方文档并没有使它静止,但是我的IDE会发出警告说他们应该这样做。

  2. 如果它们是静态的,我如何在静态AsyncTask中启动和停止ProgressBar。

  3. 修改

    这仍然会抛出“这个AsyncTask类应该是静态的,否则可能会发生泄漏”

    private class DownloadCategoryTask extends AsyncTask<String, Integer, String> {
    
        @Override
        protected String doInBackground(String... params) {
    
            Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
    
            String url = Config.API_URL +
                    "/Index.aspx?" +
                    "type=3&" +
                    "site_id=" + SITE_ID;
    
            String method = "GET";
    
            String array_name = "categories";
    
            Downloaded_category_array = Config.getJSONNew(url, method, array_name, context);
    
            return "";
    
        }
    
        protected void onPostExecute(String result) {
    
            if(isCancelled()){
                return;
            }
    
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //Update your UI here
                    //showProgressBar();
                }
            });
    
            Populate_category_list();
        }
    }
    

3 个答案:

答案 0 :(得分:1)

尝试一下我发现的解决方案:

public class MainActivity extends AppCompatActivity {
   private ProgressBar progressBar;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      progressBar = findViewById(R.id.progress_bar);
   }

   public void startAsyncTask(View v) {
      ExampleAsyncTask task = new ExampleAsyncTask(this);
      task.execute(10);
   }

    private static class ExampleAsyncTask extends AsyncTask<Integer, Integer, String> {
       private WeakReference<MainActivity> activityWeakReference;

       ExampleAsyncTask(MainActivity activity) {
          activityWeakReference = new WeakReference<MainActivity>(activity);
       }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        MainActivity activity = activityWeakReference.get();
        if (activity == null || activity.isFinishing()) {
            return;
        }

        activity.progressBar.setVisibility(View.VISIBLE);
    }

    @Override
    protected String doInBackground(Integer... integers) {
        for (int i = 0; i < integers[0]; i++) {
            publishProgress((i * 100) / integers[0]);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "Finished!";
     }
  }
}

参考:here

答案 1 :(得分:0)

不,不需要将AsyncTasks设为静态。

如果非静态方法试图修改静态成员,则IDE会抛出警告以使其成为静态。

如果您想从AsyncTask更新您的用户界面,请使用&#39; runOnUiThread&#39;。

 <a  class="primary small ui icon button" [routerLink]="['/Questionaire',item.questionnaireType,item.id,'/UpdateQuestionnaire']" >
                <i class="edit   icon"></i>
              </a>

答案 2 :(得分:0)

看起来你正在使用匿名内部类。

这是解决方案,

private class LoadData extends AsyncTask<Void, Void, String> {
    LoadData() {
    }

    @Override
    protected String doInBackground(Void... params) {
        return "task finished";
    }

    @Override
    protected void onPostExecute(String result) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Update your UI here
                //showProgressBar();
            }
        });
    }
}

 //Execute your task
 new LoadData().execute();