안드로이드 개발 질문/답변
(글 수 45,052)
수고 많으십니다.
안드로이드 공부하다가 프로그래스다이아로그에서 막혀 버렸습니다.
지금 프로그래스다이아로그(이하 [프다])에 대해서 공부를 하고 있습니다.
처리시간을 [프.다]의 막대기의 움직임에 적용하려고 하고 있습니다.
일단 소스를 보시면
public class ProgressDialogTest extends Activity {
/** Called when the activity is first created. */
private static final int MAX_PROGRESS = 100;
private ProgressDialog mProgressDialog;
private int mProgress;
private Handler mProgressHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// System.out.println("operater 1");
mProgressDialog = new ProgressDialog(TextView1.this);
mProgressDialog.setTitle("ProgressDialogTest");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMax(MAX_PROGRESS);
// System.out.println("operater 2");
mProgressDialog.show();
mProgress = 0;
mProgressDialog.setProgress(0);
// System.out.println("operater 3");
mProgressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
System.out.println("operater 4");
if (mProgress >= MAX_PROGRESS) {
// System.out.println("operater 5");
mProgressDialog.dismiss();
} else {
// System.out.println("operater 6"+ mProgress);
mProgress++;
mProgressDialog.incrementProgressBy(1);
mProgressHandler.sendEmptyMessageDelayed(0, 100);
}
}
};
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
// System.out.println("operater 7");
mProgressHandler.sendEmptyMessage(0);
}
}
).start();
}
}
위의 소스대로 하면 잘 돌아갑니다.
그런데 하고 싶은 것은 위의 소스의 MAX_PROGRESS(최대치)에 데이터 총 수를 적용 시켜
데이터를 데이터베이스에 입력하고 끝나는 작업을 [프.다]로 나타 내고 싶습니다. 그래서 소스를
이렇게 바꿨습니다.
...............................중략..............................................
//밑의 소스는 onCreate() 안에 위치하고 있습니다.
xmlParser = new XMLParser(); //입력하고 싶은 데이터는 XML데이터 입니다.
final int nodeLeng = xmlParser.getXmlDataNodes(startYmd, endYmd); // 데이터 총 노드수를 구합니다.
dialog = new ProgressDialog(this);
dialog.setTitle("데이터를 입력하고 있습니다.");
dialog.setMessage("좀만 기둘려용!!");
dialog.setMax(nodeLeng);
//dialog.setCancelable(false); // 추가질문 ) 이게 모하는 거죵??
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
final UranaiDatabaseAdapter uHelper= new UranaiDatabaseAdapter(this);
mProgressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mProgress >= nodeLeng) {
dialog.dismiss();
uHelper.close();
} else {
//xmlParser.xmlParseInsert(mProgress)는 데이터를 파싱하는 부분입니다.
// uHelper.insertFortunData 는 데이터를 인설트하는 소스입니다.
uHelper.insertFortunData(xmlParser.xmlParseInsert(mProgress));
mProgress++;
dialog.incrementProgressBy(1);
mProgressHandler.sendEmptyMessageDelayed(0, nodeLeng);
}
}
};
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
uHelper.open(); //데이터 베이스 오픈
mProgressHandler.sendEmptyMessage(0);
}
}).start();
//데이터 베이스 DAO부분은 아무 이상이 없었습니다.
데이터베이스 여는 소스 --------------------------------
//aCtx는 Context형
public UranaiDatabaseAdapter open() {
dbHelper = new DatabaseOpenHelper(aCtx);
sdb = dbHelper.getWritableDatabase();
return this;
}
public void close() {
sdb.close();
}
------------------------------------------------------
위의 소스로 고치고 나서 로그를 확인 한 결과 로고 내용은
AndroidRuntime(722): Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime(722): java.lang.IllegalStateException: database not open
AndroidRuntime(722): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1254)
AndroidRuntime(722): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1173)
AndroidRuntime(722): at com.test.fortune.UranaiDatabaseAdapter.insertFortunData(UranaiDatabaseAdapter.java:130)
AndroidRuntime(722): at com.test.fortune.UranaiDemo1_1$1.handleMessage(UranaiDemo1_1.java:76)
AndroidRuntime(722): at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(722): at android.os.Looper.loop(Looper.java:123)
AndroidRuntime(722): at android.app.ActivityThread.main(ActivityThread.java:3948)
AndroidRuntime(722): at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(722): at java.lang.reflect.Method.invoke(Method.java:521)
AndroidRuntime(722): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
AndroidRuntime(722): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
AndroidRuntime(722): at dalvik.system.NativeStart.main(Native Method)
이러 했습니다. 데이터베이스를 못 여는 것 같습니다. ㅠㅠ
디비 오픈 위치를 바꿔보고 해도 안되요 ㅠㅠ
디비.open()을 Handler안에 넣어서 해보면
에러는 나오지 않으나 프.다가 나오지 않습니다. ㅠㅠ
어떻게 해야 합니까 방법이 있으면 고수님들 조언 부탁드립니다. ㅠㅠ
안드로이드 공부하다가 프로그래스다이아로그에서 막혀 버렸습니다.
지금 프로그래스다이아로그(이하 [프다])에 대해서 공부를 하고 있습니다.
처리시간을 [프.다]의 막대기의 움직임에 적용하려고 하고 있습니다.
일단 소스를 보시면
public class ProgressDialogTest extends Activity {
/** Called when the activity is first created. */
private static final int MAX_PROGRESS = 100;
private ProgressDialog mProgressDialog;
private int mProgress;
private Handler mProgressHandler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// System.out.println("operater 1");
mProgressDialog = new ProgressDialog(TextView1.this);
mProgressDialog.setTitle("ProgressDialogTest");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.setMax(MAX_PROGRESS);
// System.out.println("operater 2");
mProgressDialog.show();
mProgress = 0;
mProgressDialog.setProgress(0);
// System.out.println("operater 3");
mProgressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
System.out.println("operater 4");
if (mProgress >= MAX_PROGRESS) {
// System.out.println("operater 5");
mProgressDialog.dismiss();
} else {
// System.out.println("operater 6"+ mProgress);
mProgress++;
mProgressDialog.incrementProgressBy(1);
mProgressHandler.sendEmptyMessageDelayed(0, 100);
}
}
};
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
// System.out.println("operater 7");
mProgressHandler.sendEmptyMessage(0);
}
}
).start();
}
}
위의 소스대로 하면 잘 돌아갑니다.
그런데 하고 싶은 것은 위의 소스의 MAX_PROGRESS(최대치)에 데이터 총 수를 적용 시켜
데이터를 데이터베이스에 입력하고 끝나는 작업을 [프.다]로 나타 내고 싶습니다. 그래서 소스를
이렇게 바꿨습니다.
...............................중략..............................................
//밑의 소스는 onCreate() 안에 위치하고 있습니다.
xmlParser = new XMLParser(); //입력하고 싶은 데이터는 XML데이터 입니다.
final int nodeLeng = xmlParser.getXmlDataNodes(startYmd, endYmd); // 데이터 총 노드수를 구합니다.
dialog = new ProgressDialog(this);
dialog.setTitle("데이터를 입력하고 있습니다.");
dialog.setMessage("좀만 기둘려용!!");
dialog.setMax(nodeLeng);
//dialog.setCancelable(false); // 추가질문 ) 이게 모하는 거죵??
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
final UranaiDatabaseAdapter uHelper= new UranaiDatabaseAdapter(this);
mProgressHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (mProgress >= nodeLeng) {
dialog.dismiss();
uHelper.close();
} else {
//xmlParser.xmlParseInsert(mProgress)는 데이터를 파싱하는 부분입니다.
// uHelper.insertFortunData 는 데이터를 인설트하는 소스입니다.
uHelper.insertFortunData(xmlParser.xmlParseInsert(mProgress));
mProgress++;
dialog.incrementProgressBy(1);
mProgressHandler.sendEmptyMessageDelayed(0, nodeLeng);
}
}
};
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
uHelper.open(); //데이터 베이스 오픈
mProgressHandler.sendEmptyMessage(0);
}
}).start();
//데이터 베이스 DAO부분은 아무 이상이 없었습니다.
데이터베이스 여는 소스 --------------------------------
//aCtx는 Context형
public UranaiDatabaseAdapter open() {
dbHelper = new DatabaseOpenHelper(aCtx);
sdb = dbHelper.getWritableDatabase();
return this;
}
public void close() {
sdb.close();
}
------------------------------------------------------
위의 소스로 고치고 나서 로그를 확인 한 결과 로고 내용은
AndroidRuntime(722): Uncaught handler: thread main exiting due to uncaught exception
AndroidRuntime(722): java.lang.IllegalStateException: database not open
AndroidRuntime(722): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1254)
AndroidRuntime(722): at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1173)
AndroidRuntime(722): at com.test.fortune.UranaiDatabaseAdapter.insertFortunData(UranaiDatabaseAdapter.java:130)
AndroidRuntime(722): at com.test.fortune.UranaiDemo1_1$1.handleMessage(UranaiDemo1_1.java:76)
AndroidRuntime(722): at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(722): at android.os.Looper.loop(Looper.java:123)
AndroidRuntime(722): at android.app.ActivityThread.main(ActivityThread.java:3948)
AndroidRuntime(722): at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(722): at java.lang.reflect.Method.invoke(Method.java:521)
AndroidRuntime(722): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
AndroidRuntime(722): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
AndroidRuntime(722): at dalvik.system.NativeStart.main(Native Method)
이러 했습니다. 데이터베이스를 못 여는 것 같습니다. ㅠㅠ
디비 오픈 위치를 바꿔보고 해도 안되요 ㅠㅠ
디비.open()을 Handler안에 넣어서 해보면
에러는 나오지 않으나 프.다가 나오지 않습니다. ㅠㅠ
어떻게 해야 합니까 방법이 있으면 고수님들 조언 부탁드립니다. ㅠㅠ