我想从数据库中加载主活动布局中的一些数据,而发生这种情况我想向用户显示一个数据弹出对话框。我尝试过使用线程和异步任务,但仍然屏幕冻结,而数据正在加载,最后当它完成时,它显示我的弹出窗口。我想让对话框同时显示数据加载。下面的 是加载数据并调用异步任务的主要活动的功能。如何在数据加载到主活动布局时启动向用户显示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;
}
我想你的建议的方式。问题出在doInBackground方法,当我尝试更新布局元素(Textview,ImageView其他网格等)与来自数据库的数据我有这个错误。 “只有创建视图层次结构的原始线程才能触及其视图。”怎么能解决这个问题? –
您应该只更新'onPreExecute'或'onPostExecute'方法调用中的布局。我已经明确提到了这一点。您只能从UI线程更新布局。 'doInBackground'将在后台线程中调用。当你从'doInBackground'返回时需要传递你需要的任何数据,并在'onPostExecute'中使用它。 – mallaudin
嗯,你说的是对的,它在某种程度上有所帮助..但是我最终的目标是将数据加载到背景同时显示进度对话框。但是,感谢帮助到目前为止 –