AsyncTask的进度对话框 - Android

4
我正在尝试在Twitter Feed加载时显示进度对话框...但是当Twitter Feed出现时,进度对话框仍然停留在屏幕上。非常感谢您的帮助。
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!");
        }
    }
}
4个回答

7

在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
    }
}

0

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? - user3156801
哦,不行啊,如果发生错误,你就必须更改代码。这仅仅是根据你的代码的一般思路。解决这些错误。例如——看看我最近的更新。你不能在isConnected方法中直接使用this,因为这里的this指的是线程而不是主活动。请改变代码。 - My God

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接