私のアプリケーションは、データをバックエンドにアップロードしたいと考えています。アップロード機能は 2 か所で利用できます。1 つは請求書を入れた後、他の UI に影響を与えずにバックエンドにアップロードする必要があります。Service
つまり、ユーザーがUpload
ボタンをクリックしてアップロードする必要がある場合、別のアップロード機能を介してすべてのテーブルがユーザーに表示されますAsyncTask
。
問題は、同じアップロード テーブル メソッドを呼び出すと、can't create handler inside thread that has not called looper.prepare()
このエラーが発生することです。
06-14 09:53:52.504: W/System.err(2288): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
06-14 09:53:52.514: W/System.err(2288): at android.os.Handler.<init>(Handler.java:152)
06-14 09:53:52.514: W/System.err(2288): at android.app.Activity.<init>(Activity.java:714)
06-14 09:53:52.514: W/System.err(2288): at xont.ventura.controller.syn.UploadActivity.<init>(UploadActivity.java:43)
06-14 09:53:52.514: W/System.err(2288): at xont.ventura.controller.service.UploadService.uploadUsingService(UploadService.java:102)
06-14 09:53:52.514: W/System.err(2288): at xont.ventura.controller.service.UploadService$ServiceThread.run(UploadService.java:3872)
私のコードは次のとおりです。
@Override
public void onStart(Intent intent, int startid) {
Toast.makeText(this, "Upload Service Started", Toast.LENGTH_LONG).show();
if(! APPURL.equals("")){
serviceThread = new ServiceThread();
serviceThread.start();
if(result.equals("The operation timed out")) {
Toast.makeText(this,"Service is not working OR Time out to Connect to service !!!!!!!",Toast.LENGTH_LONG).show();
}
}else{
Toast.makeText(this, "GPRS/WIFI is not available", Toast.LENGTH_LONG).show();
}
Log.d(TAG, "onStart");
}
private class ServiceThread extends Thread {
@Override
public void run() {
result = uploadUsingService();
}
};
public String uploadUsingService(){
uploadTable = getUploadTable();
String result = "";
try {
// dbAdapter.openDataBase();
if(uploadTable.size() > 0){
for (Map.Entry<Integer, String> entry : uploadTable.entrySet()) {
String value = entry.getValue();
if(value.equals("WMInvoiceHeader")){
result = new UploadActivity().getInvoiceHeader();
}else if(value.equals("WMInvoiceLine")){
result = new UploadActivity().getInvoiceLine();
}else if(value.equals("WMInvoiceHeaderDiscount")){
result = new UploadActivity().getInvoiceHeaderDiscount();
}else if(value.equals("WMInvoiceSpecialDiscount")){
result = new UploadActivity().getInvoiceSpecialDiscount();
}else if(value.equals("WMInvoiceCancelHeader")){
result = new UploadActivity().getInvoiceCancelHeader();
}else if(value.equals("WMInvoiceCancelLine")){
result = new UploadActivity().getInvoiceCancelLine();
}else if(value.equals("WMTransactionControl")){
result = new UploadActivity().getTransactionControl();
}else if(value.equals("WMVisitDetail")){
result = new UploadActivity().getVisitDetail();
}
if(result.equals("The operation timed out")) break;
}
}
//Toast.makeText(this, "Upload Service End", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
ここでの問題はnew UploadActivity().functionname
、同じクラス内にこの関数を記述した場合に呼び出すことです。それは何の問題もありません。のようgetInvoiceCancelLine()
に。このように書くと、アップロード機能のメソッドを 2 か所書く必要があります。どうすれば同じ方法を再利用できますか 2 場所.
この問題から私を助けてください。
前もって感謝します。