2014-09-23 71 views
3

我試圖顯示一個進度對話框,同時Twitter的飼料正在加載......然而當Twitter的飼料出現時進度對話框仍然保留在屏幕上。任何幫助深表感謝。AsyncTask的進度對話框 - Android

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!"); 
     } 
    } 
} 

回答

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

您必須在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(); 
     } 
    } 
    } 
0

方法onPreExecute()doInBackground()和的AsyncTask的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(); 

} 
+0

的「androidNetworkUtility.isConnected(本)」是否顯示錯誤...它會提示您更改爲空? – user3156801 2014-09-23 15:07:13

+0

哦,沒有人,如果出現錯誤,您必須更改代碼。根據你的代碼,這只是一般的想法。解決這個錯誤。例如 - 看看我最近的更新。你不能直接在isConnected方法中使用'this',因爲'this'指的是線程而不是主要的活動。更改代碼。 – 2014-09-23 15:20:53