2014-09-23 8 views
3

트위터 피드가로드되는 동안 진행 대화 상자를 표시하려고합니다 ... 그러나 트위터 피드가 표시되면 진행 대화 상자가 화면에 남아 있습니다. 어떤 도움이라도 대단히 감사합니다.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() 메서드를 호출해야합니다. 예를 들어 : -

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

방법 onPreExecute(), doInBackground() 및 AsyncTask를의 onPostExecute()은 당신이 언급 한 목적을 위해 사용됩니다. 작업 진행을 나타내는 사용자 인터페이스 요소입니다. ProgressDialog는 최신 버전에서 더 이상 사용되지 않습니다. https://developer.android.com/reference/android/widget/ProgressBar.html

+0

는 "androidNetworkUtility.isConnected (이)"오류를 보여주고있다 ... 그것은 null로 변경하라는 메시지를 표시합니다 : 추가 정보를 위해

안드로이드 개발자 공식 사이트를 참조하십시오? – user3156801

+0

오, 당신은 오류가있는 경우 코드를 변경해야합니다. 이는 코드에 따른 일반적인 아이디어 일뿐입니다. 이 오류를 해결하십시오. 예 : - 최근 업데이트를 확인하십시오. isConnected 메쏘드에서'this'를 직접 사용할 수 없습니다. 왜냐하면'this'는 스레드를 가리키고 있지만 메인 액티비티를 가리 키지 않기 때문입니다. 코드를 변경하십시오. –

0

의 ProgressBar를해서 ProgressDialog에 대한 최선의 대안입니다

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(); 
     } 
    } 
    }