2016-11-23 16 views
0

在異步任務的onPreExecute方法中有一個進度對話框,但異步任務從數據庫中提取數據時不會立即顯示。你能建議一些在按鈕點擊時立即顯示進度對話框的東西。在當前場景中,屏幕在獲取數據時會凍結。一旦獲取,它就會進入下一個屏幕,但同時它不會顯示我的進度對話框。 下面是異步任務在UI中顯示POPup對話框時需要幫助,同時在後臺異步任務中加載數據

public class waitAsync extends AsyncTask<String, Void, String> { 
    ResultSet rs=null; 
    private ProgressDialog processingDialog; 
    static Connection conn=null; 
    Statement stmt; 
    // waitThread wt= new waitThread(); 
    @Override 
    protected void onPreExecute() { 
     // ProgressDialog processingDialog; 
     super.onPreExecute(); 
     processingDialog = new ProgressDialog(MainActivity.mCon); 
     processingDialog.show(); 
     processingDialog.setContentView(R.layout.activity_wait); 
     //processingDialog.setMessage("Loading..."); 

    } 
    @Override 
    protected String doInBackground(String... params) { 
     try { 


      String driver = "net.sourceforge.jtds.jdbc.Driver"; 
      String ip = "mfb.dfsdfsdf.ap-north-1.rds.amazonaws.com"; 
      String classs = "net.sourceforge.jtds.jdbc.Driver"; 
      String db = "MyDatabase"; 
      String un = "xxxwww"; 
      String password = "xxxxxx"; 
      Class.forName(classs); 

      String ConnURL = null; 
      ConnURL = "jdbc:jtds:sqlserver://" + ip + ";" 
        + "databaseName=" + db + ";user=" + un + ";password=" 
        + password + ";"; 
      conn = DriverManager.getConnection(ConnURL); 

      stmt = conn.createStatement(
        ResultSet.TYPE_SCROLL_INSENSITIVE, 
        ResultSet.CONCUR_READ_ONLY); 
      rs=stmt.executeQuery(params[0]); 
      int size = 0; 


      //conn.close(); 
      MainActivity.getdata=rs; 
      MainActivity.flag=1; 
      //Thread.sleep(5000); 
     } catch (Exception e) 
     { 
      Log.w("Error connection", "" + e.getMessage()); 
     } 
     return null; 
     } 
    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     processingDialog.dismiss(); 
     // wt.interrupted(); 


    } 



} 

異步任務從Main_Activity

Getdata(String bookid) 
{ 
    String SQL="Select eb.book_name,eb.AuthorID,ma.Name,eb.GenreID_M,eb.GenreID_D,gm.Genre_MN+'- '+gd.Genre_DN as Genre,isnull(eb.pubDate,'') pubDate,isnull(eb.book_Loc,'') book_Loc,\n" + 
        " eb.Price,eb.ico_Loc,eb.Descrip from Master_ebook eb inner join Master_Author ma on eb.AuthorID=ma.Author_ID\n" + 
        " inner join Master_Genre_M gm on eb.GenreID_M=gm.Genre_MID\n" + 
        "inner join Master_Genre_D gd on eb.GenreID_D= gd.Genre_DID where eb.bookID=" + bookid; 


      new waitAsync().execute(SQL); 

      int c=0; 
      while(MainActivity.flag==0) 
      { 
       c++; 
      } 

      if(MainActivity.flag==1) 
      { 
       MainActivity.flag=0; 
       //processingDialog.dismiss(); 
      } 

      ResultSet rs=MainActivity.getdata; 
} 
+0

因爲顯然你已經用'while(MainActivity.flag == 0) {C++; }'....此代碼使AsyncTask無用 – Selvin

+0

我還能做什麼?你能建議嗎?我將不得不等待,直到我的異步任務獲取我的數據,因爲我將立即在主要活動中需要該數據getdata方法 –

+0

我認爲我在你的asynctask中所做的更改已經足夠了 –

回答

0

在異步任務之後,您不需要像這樣的循環。它會阻止你的UI線程。

while(MainActivity.flag==0) // wrong - blocking main thread 
      { 
       c++; 
      } 

您需要創建活動的方法,說onDataAvailable並在此方法 你可以做任何你想做的事,要麼去下一個活動或什麼的,然後調用從onPostExecute

@Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     processingDialog.dismiss(); 
     // call load complete method here 


    } 
這種方法

這是您更新的異步任務。

public class WaitAsyncTask extends AsyncTask<String, Void, String> { 

    private WeakReference<MainActivity> activityRef; 

    public WaitAsyncTask(MainActivity activity){ 
     activityRef = new WeakReference<MainActivity>(activity); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     // show dialog 
    } 
    @Override 
    protected String doInBackground(String... params) { 
     // do you work in background 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String data) { 
     super.onPostExecute(data); 
     // hide dialog 
     if(activityRef.get() != null){ 
      // call load completed method in activity 
      activityRef.get().loadCompleted(data); 
     } 
    } 
} // WaitAsyncTask 

並在您的MainActivity中創建一個您想要接收結果的方法。我已經創建了這個方法

public void loadCompleted(String data){ 
     // this will be called automatically after fetching data is completed 
    } 

MainActivity這是我從我的任務調用。你不需要while循環來等待。此方法將在您的數據被提取後調用。

+0

它終於工作..非常感謝我的朋友@mallaudin –

+0

很高興知道這一點。乾杯 – mallaudin

-1

傳遞活動情境中通過一個的AsyncTask構造函數的調用異步任務和使用方面來代替。像

 Context mainActivityCtxt; 
    waitAsync(Context ctx) { 
     this.mainActivityCtxt = ctx; 
    }; 

    new waitAsync(mainActivityCtxt).execute(SQL); 

希望這會有所幫助。

+0

嗨,我之前嘗試過,它給出了一個異常錯誤「android.util.AndroidRuntimeException:requestFeature()必須在添加內容之前調用」。後來我意識到我必須編寫processingDialog.show();在setContentView之前。 –

+0

然後嘗試使用setMessage(「some message」)而不是setcontentview並檢查atleast對話框是否顯示。另外,通過構造函數傳遞上下文,而不是通過靜態引用。 –

+0

在顯示進度對話框之前,您無法設置'setContentView(R.layout.activity_wait);'。 – mallaudin

相關問題