2016-11-21 54 views
0

我想從數據庫中加載主活動佈局中的一些數據,而發生這種情況我想向用戶顯示一個數據彈出對話框。我嘗試過使用線程和異步任務,但仍然屏幕凍結,而數據正在加載,最後當它完成時,它顯示我的彈出窗口。我想讓對話框同時顯示數據加載。下面的 是加載數據並調用異步任務的主要活動的功能。如何在數據加載到主活動佈局時啓動向用戶顯示UI屏幕的活動

public void call_itemdisplay(final String bookid) 
    { 
     new waitAsync().execute(); 
     //load data from DB below 
     } 

啓動一個新的活動

public class waitAsync extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 
    try { 
     Intent i = new Intent(MainActivity.mCon, waitActivity.class); 
     MainActivity.mCon.startActivity(i); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
     return null; 
     } 


} 

由異步任務

public class waitActivity extends Activity { 
    static waitActivity wact; 
    public static Context wcon; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     wact=this; 

     setContentView(R.layout.activity_wait); 
    } 

} 

中顯示的UI,同時彈出的活動需要幫助啓動彈出式窗口活動的異步任務數據加載在主要活動中。目前,該屏幕凍結在加載數據,然後顯示所有在一起後加載完成

有新的變化編輯:異步任務

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

回答

1

在您的AsyncTask,

  • 使用onPreExecute來顯示01在個
  • 加載數據,這種方法將在worker thread
  • 隱藏對話框堪稱onPostExecute

    ... AsyncTask<String, String, String>() { 
         @Override 
         protected void onPreExecute() { 
          super.onPreExecute(); 
          // show dialog 
         } 
        // UPDATE 
        @Override 
        protected void onProgressUpdate(String... values) { 
         super.onProgressUpdate(values); 
         // this method will be called when you call 
         // publishProgress from doInBackground. 
        }  
         @Override 
         protected String doInBackground(String[] params) { 
          // load data and return 
          // this data will passed to onPostExecute 
          publishProgress(param); // call onProgressUpdate 
          return null; 
         } 
    
         @Override 
         protected void onPostExecute(String o) { 
          super.onPostExecute(o); 
          // hide dialog 
         } 
    } 
    

這裏有幾個鏈接,你可以找到在實現自己的目標

有用
+0

我想你的建議的方式。問題出在doInBackground方法,當我嘗試更新佈局元素(Textview,ImageView其他網格等)與來自數據庫的數據我有這個錯誤。 「只有創建視圖層次結構的原始線程才能觸及其視圖。」怎麼能解決這個問題? –

+0

您應該只更新'onPreExecute'或'onPostExecute'方法調用中的佈局。我已經明確提到了這一點。您只能從UI線程更新佈局。 'doInBackground'將在後臺線程中調用。當你從'doInBackground'返回時需要傳遞你需要的任何數據,並在'onPostExecute'中使用它。 – mallaudin

+0

嗯,你說的是對的,它在某種程度上有所幫助..但是我最終的目標是將數據加載到背景同時顯示進度對話框。但是,感謝幫助到目前爲止 –

0

可以顯示你的對話是這樣的。 onPreExecute()方法將調用第一個在此方法中顯示對話框。 然後doInBackground和doInBackground()方法中的後臺任務完成後,它會將其結果傳遞給onPostExecute(),您可以在這裏放棄加載對話框。

class BackgroundTask extends AsyncTask<Void, Void, String> 
{ 
    ProgressDialog progressDialog; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

     progressDialog = new ProgressDialog(mContext); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.show(); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 

     //do your task here; 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     progressDialog.dismiss(); 
    } 
} 
+0

我嘗試了你建議的方式。問題出在doInBackground方法,當我嘗試更新佈局元素(Textview,ImageView其他網格等)與來自數據庫的數據我有這個錯誤。 「只有創建視圖層次結構的原始線程才能觸及其視圖。」怎麼能解決這個問題? –

+0

對,你不能在doInBackground方法內更新UI。它只適用於非UI任務。所有UI任務應該在onPostExecute()方法中完成。 –

0

你必須首先使用onPreExecute()方法,以顯示對話框,然後在doInBackground從DATABSE獲取您的數據()方法,在下面的代碼片段我已經showned你如何返回從獲取的數據DB到onPostExecute()方法,您可以進一步處理,最後您只需要關閉()onPostExecute()中的對話框並啓動下一個活動。

private class waitAsync extends AsyncTask<Void, Void, String[]> { 
     private ProgressDialog processingDialog; 
     Context cnt = null; 
      waitAsync(Context cnt) 
      { 
       this.cnt = cnt; 
       } 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Showing progress dialog 
      processingDialog = new ProgressDialog(cnt); 
      processingDialog.setMessage("Loading..."); 
      processingDialog.show(); 
     } 

     @Override 
     protected String[] doInBackground(Void... arg0) { 
      //load data from DB below 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String[] result) { 
      super.onPostExecute(result); 
      // Dismiss the progress dialog 
      processingDialog.dismiss(); 
      try { 
      Intent i = new Intent(cnt, waitActivity.class); 
      cnt.startActivity(i); 

      } catch (Exception e) { 
      e.printStackTrace(); 
      } 
     } 

    } 

您可以通過簡單地調用ASYC任務調用此方法,這將在後臺進行的話,這應該工作:

// Calling async task to fetch data from DB 
    new waitAsync (context).execute(); 
相關問題