【问题标题】:Progress Dialog for AsyncTask - AndroidAsyncTask 的进度对话框 - Android
【发布时间】:2017-09-20 03:05:59
【问题描述】:

我正在尝试在 twitter 提要加载时显示进度对话框...但是当 twitter 提要出现时,进度对话框仍保留在屏幕上。非常感谢任何帮助。

public class MainActivity extends ListActivity {

    final static String twitterScreenName = "CFABUK";
    final static String TAG = "MainActivity";
    private AsyncTask<Object, Void, ArrayList<TwitterTweet>> tat;
    boolean done;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        done=false;
        AndroidNetworkUtility androidNetworkUtility = new AndroidNetworkUtility();
        if (androidNetworkUtility.isConnected(this)) {
            TwitterAsyncTask syn=new TwitterAsyncTask();
            syn.execute(twitterScreenName,this);


            ProgressDialog pd = new ProgressDialog(MainActivity.this);
            pd.setMessage("loading");
            pd.show();

            do {
                if(!(syn.getStatus()==AsyncTask.Status.RUNNING)) {
                pd.dismiss();
                pd.cancel();
                done=true;
                }
            } while(done=false);


        } else {
            Log.v(TAG, "Network not Available!");
        }
    }
}

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

    您必须在 AsyncTasks onPreExecute() 上调用 ProgressDialog show() 方法。例如:

    class MyTask extends AsyncTask<Void, Void, Void> {
     ProgressDialog pd;
        @Override
        protected void onPreExecute() {
          super.onPreExecute();
           pd = new ProgressDialog(MainActivity.this);
           pd.setMessage("loading");
           pd.show();
        }
    
        @Override
        protected Void doInBackground(Void... params) {
          // Do your request
        }
    
        @Override
        protected void onPostExecute(Void result) {
          super.onPostExecute(result);
          if (pd != null)
          {
             pd.dismiss();
          }
        }
      }
    

    【讨论】:

      【解决方案2】:

      您必须使用 AsyncTask 类的 onPreExecute 和 onPostExecute。例如:

      class AsyncData extends AsyncTask<Void, Void, Void>{
      
          @Override
          protected void onPreExecute() {
              super.onPreExecute();
              // init progressdialog
          }
      
      
          @Override
          protected Void doInBackground(Void... arg0) {
              // get data
              return null;
          }
      
      
          @Override
          protected void onPostExecute(Void result) {
              super.onPostExecute(result);
              // dismiss dialog
          }
      }
      

      【讨论】:

        【解决方案3】:

        AsyncTask 的onPreExecute()doInBackground()onPostExecute() 方法用于您提到的目的-

        public class MainActivity extends ListActivity {
        
            final static String twitterScreenName = "CFABUK";
            final static String TAG = "MainActivity";
            private AsyncTask<Object, Void, ArrayList<TwitterTweet>> tat;
            boolean done;
            Context context;
        
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                done=false;
                context = this;
                new NetworkTask().execute();
            }
        }
        
        
        class NetworkTask extends AsyncTask<String, String, String> 
        {
        
          Context ctx = context ;
        
          @Override
          protected void onPreExecute() 
          {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Working ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }
        
        @Override
        protected String doInBackground(String... args) 
        {
        
            //Do your background work here and pass the value to onPostExecute
        
            AndroidNetworkUtility androidNetworkUtility = new AndroidNetworkUtility();
        
            if (androidNetworkUtility.isConnected(ctx)) {
                    TwitterAsyncTask syn=new TwitterAsyncTask();
                    syn.execute(twitterScreenName,this);
        
                     while(done)
                     {
                        if(!(syn.getStatus()==AsyncTask.Status.RUNNING)) 
                        {
                           done=true;
                        }
                        else 
                        {
                           Log.v(TAG, "Network not Available!");
                        } 
                     }
        
            return done + "";
        
        }
        
        protected void onPostExecute(String result) 
        {
        
           //Do something with result and close the progress dialog
        
           pDialog.dismiss();
        
        }
        

        【讨论】:

        • “androidNetworkUtility.isConnected(this)”显示错误...提示您更改为null?
        • 哦,不,如果出现错误,您必须更改代码。这只是根据您的代码的一般想法。解决此错误。例如 - 看看我最近的更新。您不能在 isConnected 方法中直接使用this,因为这里的this 指的是线程而不是主要活动。更改代码。
        【解决方案4】:

        ProgressBar 是 ProgressDialog 的最佳替代品。指示操作进度的用户界面元素。 ProgressDialog 在最新版本中已弃用。

        更多信息见安卓开发者官网:https://developer.android.com/reference/android/widget/ProgressBar.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多