0

我的应用程序想要将数据上传到后端。上传功能可用 2 个地方。一种是在放发票后,它需要上传到后端而不影响其他 UI,这意味着如果用户点击按钮需要上传,通过Service另一个上传功能将向用户显示所有表格,通过.UploadAsyncTask

现在的问题是,如果我调用相同的上传表方法,那么它就会出现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 地方。

请帮我解决这个问题?

提前致谢。

4

3 回答 3

1

你想在 mainActivity 中运行另一个线程,我们需要一个 Handler 来处理它。

查看链接

我认为它对你有帮助。

谢谢

于 2012-06-14T04:44:12.853 回答
1

java.lang.RuntimeException:无法在未调用 Looper.prepare() 的线程内创建处理程序

通常是在您尝试对非 UI 线程上的 UI 元素执行操作时引起的。

您只显示了代码片段。所以不能肯定地评论您在哪里犯了错误。但请确保您没有尝试访问或修改 ServiceThread 中的 UI 元素。

如果您可以向我们显示更多代码,我们可以为您提供帮助。

于 2012-06-14T04:46:29.853 回答
1

UI 线程(事件线程)不是线程安全的,所以你不能对 UI 进行任何操作到另一个线程。通过查看您的代码,您似乎正在对方法进行一些 UI 操作

getUploadTable()

您可以在另一个线程之外调用此方法,然后将结果传递给 ServiceThread。

于 2012-06-14T04:55:16.167 回答