嗨,我有一个挑战,我不确定我做错了什么。
我有一个应用程序从Web服务获取数据并将其导入手机上的本地数据库。
我有一个名为ConnectServer
的班级。这个类有一个名为updatedata
的公共方法。在活动中使用数据时,我调用ConnectServer.updatedata()
方法来“刷新”本地数据库。 Winthin我正在做以下活动:
final ProgressDialog dialog = ProgressDialog.show(this, "",this.getText(R.string.txt_fetch_data), true);
new Thread() {
public void run() {
try{
ConnectServer.updatedata();
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
// dismiss the progress dialog
dialog.dismiss();
}
}.start();
Sofar这么好。我试图实现的是,它不是平面对话框,而是显示进度条。
public class ConnectServer {
public static String updatedata(Context _context){
importData(callServer());
}
private String callServer(){
// https request to server returns JSON
}
private importData(String data){
// loop thru data and insert / update local sqlite3 database
//
// TODO ----> update progress bar on each loop <----
//
}}
请帮忙。我花了好几个小时才弄清楚如何做到这一点
感谢
答案 0 :(得分:1)
请注意,所有UI调用必须在UI线程上运行。
例如ProgressDialog.show
或dialog.dismiss()
等来电。
要确保它们在UI线程上运行,您可以:
onCreate
,onClick
......等等的UI处理程序中调用它们。runOnUiThread
onPostExecute
或onProgressUpdate
答案 1 :(得分:0)
我让它发挥作用
dialog=new ProgressDialog(AssetListActivity.this);
dialog.setTitle(getText(R.string.lbl_connecting));
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.setProgress(0);
dialog.setMax(0);
dialog.show();
final Runnable r = new Runnable(){
public void run(){
//update current gui after data is loaded
updategui();}
};
new Thread() {
public void run() {
try{
Looper.prepare();
ConnectServer.updatedata(dialog);
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
mHandler.post(r);
dialog.dismiss();
}
}.start();
在ConnectServer类中,callServer()方法
// vObject.getString("count") is the record count
final int a = Integer.parseInt(vObject.getString("count"));
if (dialog != null){
Runnable task = new Runnable()
{
public void run()
{
dialog.setTitle(_context.getText(R.string.lbl_importing));
dialog.setMax(a);
}
};
new Handler(Looper.getMainLooper()).post(task);
}