Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t在未调用Looper.prepare()的线程内创建处理程序-后台服务_Android - Fatal编程技术网

Android Can';t在未调用Looper.prepare()的线程内创建处理程序-后台服务

Android Can';t在未调用Looper.prepare()的线程内创建处理程序-后台服务,android,Android,我的应用程序希望将数据上载到后端。上传功能在2个位置可用。一个是在放入发票后,它需要上传到后端而不影响其他UI,这意味着通过服务另一个上传功能将向用户显示所有表格,如果用户单击上传按钮需要上传,通过异步任务 现在的问题是,如果我调用相同的upload table方法,那么它就不能在没有调用looper.prepare()的线程内创建处理程序,这是一个错误 06-14 09:53:52.504: W/System.err(2288): java.lang.RuntimeException: Can

我的应用程序希望将数据上载到后端。上传功能在2个位置可用。一个是在放入发票后,它需要上传到后端而不影响其他UI,这意味着通过
服务
另一个上传功能将向用户显示所有表格,如果用户单击
上传
按钮需要上传,通过
异步任务

现在的问题是,如果我调用相同的upload table方法,那么它就不能在没有调用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)
06-14 09:53:52.504:W/System.err(2288):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
06-14 09:53:52.514:W/System.err(2288):在android.os.Handler上。(Handler.java:152)
06-14 09:53:52.514:W/System.err(2288):在android.app.Activity。(Activity.java:714)
06-14 09:53:52.514:W/System.err(2288):在xont.ventura.controller.syn.UploadActivity.(UploadActivity.java:43)
06-14 09:53:52.514:W/System.err(2288):在xont.ventura.controller.service.UploadService.uploadUsingService(UploadService.java:102)
06-14 09:53:52.514:W/System.err(2288):在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;
}
@覆盖
公共无效启动(Intent Intent,int startid){
Toast.makeText(此“上载服务已启动”,Toast.LENGTH_LONG.show();
如果(!APPURL.equals(“”){
serviceThread=新的serviceThread();
serviceThread.start();
if(result.equals(“操作超时”)){
Toast.makeText(此“服务不工作或连接到服务超时!!!!!!!”,Toast.LENGTH\u LONG.show();
}
}否则{
Toast.makeText(此“GPRS/WIFI不可用”,Toast.LENGTH_LONG.show();
}
Log.d(标签“onStart”);
}
私有类ServiceThread扩展线程{
@凌驾
公开募捐{
结果=uploadUsingService();
}   
};
公共字符串上载UsingService(){
uploadTable=getUploadTable();
字符串结果=”;
试一试{
//dbAdapter.openDataBase();
if(uploadTable.size()>0){
对于(Map.Entry:uploadTable.entrySet()){
字符串值=entry.getValue();
if(value.equals(“WMInvoiceHeader”)){
结果=新的UploadActivity().getInvoiceHeader();
}else if(value.equals(“WMInvoiceLine”)){
结果=新上载活动().getInvoiceLine();
}else if(value.equals(“WMInvoiceHeaderDiscount”)){
结果=新的UploadActivity().getInvoiceHeaderDiscount();
}else if(value.equals(“WMInvoiceSpecialDiscovery”)){
结果=新上载活动().GetInvoiceSpecialDiscovery();
}else if(value.equals(“WMInvoiceCancelHeader”)){
结果=新的UploadActivity().getInvoiceCancelHeader();
}else if(value.equals(“WMInvoiceCancelLine”)){
结果=新上载活动().getInvoiceCancelLine();
}else if(value.equals(“WMTransactionControl”)){
结果=新的UploadActivity().getTransactionControl();
}else if(value.equals(“WMVisitDetail”)){
结果=新上载活动().getVisitDetail();
}
如果(结果等于(“操作超时”))中断;
}
}
//Toast.makeText(这是“上传服务端”,Toast.LENGTH_LONG.show();
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
这里的问题是调用
newuploadActivity().functionname
,如果我在同一个类中编写这个函数。它没有任何问题。比如
getInvoiceCanceline()
。如果我这样写,那么两个地方必须写上传功能方法。我怎样才能重复使用相同的方法2的地方

请帮我解决这个问题好吗


提前谢谢

如果要在mainActivity中运行另一个线程,我们需要一个处理程序来处理它

查看

我想这对你有帮助


谢谢

如果您想在mainActivity中运行另一个线程,我们需要一个处理程序来处理它

查看

我想这对你有帮助

谢谢

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

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

您只显示了一段代码。因此,不能肯定您在哪里犯了错误。但请确保您没有试图访问或修改ServiceThread中的UI元素

如果你能向我们展示更多的代码,我们可以帮助你

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

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

您只显示了一段代码。因此,不能肯定您在哪里犯了错误。但请确保您没有试图访问或修改ServiceThread中的UI元素

如果您能向我们展示更多的代码,我们可以帮助您。

UI线程(事件线程)不是线程安全的,因此您无法在UI上执行任何操作并将其插入另一个线程。 通过查看您的代码,您似乎正在对方法进行一些UI操作

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

UI线程(事件线程)不是线程安全的,因此您无法在UI上对另一个线程执行任何操作。 通过查看您的代码,您似乎正在对方法进行一些UI操作

getUploadTable()

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

是否在UploadActivity()中创建处理程序。functionname?是否在任何UploadActivity()中创建处理程序