我在异步任务的OnPreexecute方法中有一个进度对话框,但是在异步任务中获取数据时,它不会立即显示。您能否提出一些可以在按钮上立即在按钮上显示进度对话框的内容。在当前情况下,屏幕在获取数据时会冻结。一旦获取,它就会进入下一个屏幕,但并没有显示我的进度对话框。以下是异步任务
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_IDn" +
" inner join Master_Genre_M gm on eb.GenreID_M=gm.Genre_MIDn" +
"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;
}
在异步任务后您不需要这样的循环。它将阻止您的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
中,我从我的任务中调用。您不需要循环等待。获取数据后将调用此方法。
将活动上下文通过asynctask中的构造函数传递到异步任务,然后使用该上下文。喜欢
Context mainActivityCtxt;
waitAsync(Context ctx) {
this.mainActivityCtxt = ctx;
};
new waitAsync(mainActivityCtxt).execute(SQL);
希望这会有所帮助。