0

私のアプリケーションは、データをバックエンドにアップロードしたいと考えています。アップロード機能は 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 場所.

この問題から私を助けてください。

前もって感謝します。

4

3 に答える 3

1

UI スレッド (イベント スレッド) はスレッド セーフではないため、UI の操作を別のスレッドに実行することはできません。あなたのコードを見ると、いくつかのUIをメソッドに入れているようです

getUploadTable()

別のスレッドの外部でこのメソッドを呼び出し、その結果を ServiceThread に渡すことができます。

于 2012-06-14T04:55:16.167 に答える
1

mainActivity 内で別の Thread を実行したい場合は、それを処理する Handler が 1 つ必要です。

リンクをチェックしてください

お役に立てると思います。

ありがとう

于 2012-06-14T04:44:12.853 に答える
1

java.lang.RuntimeException: Looper.prepare() を呼び出していないスレッド内でハンドラを作成できません

これは通常、非 UI スレッドで UI 要素に何かをしようとしたときに発生します。

コードのスニペットのみを示しています。間違いを犯した場所を正確にコメントすることはできません。しかし、ServiceThread 内の UI 要素にアクセスしたり変更したりしようとしていないことを確認してください。

もっと多くのコードを見せていただければ、お手伝いできます。

于 2012-06-14T04:46:29.853 に答える