Android 在doInBackground()中调用位置坐标时出错

Android 在doInBackground()中调用位置坐标时出错,android,android-asynctask,gps,Android,Android Asynctask,Gps,我正在尝试使用AsyncTask方法将数据发送到服务器 我正在获取所有其他设备信息和用户详细信息 但是,当我尝试获取背景中try catch内的位置坐标时, 我得到以下错误: java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序。 非常感谢您的帮助 代码如下: 这是我的类,其中应用了AsyncTask @Override public void onClick(View view) { if (fields

我正在尝试使用
AsyncTask
方法将数据发送到服务器

我正在获取所有其他设备信息和用户详细信息

但是,当我尝试获取
背景
try catch
内的
位置坐标时,
我得到以下错误:

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

非常感谢您的帮助

代码如下:

这是我的类,其中应用了
AsyncTask

 @Override
    public void onClick(View view) {
       if (fieldsValidation().equals("ok")) {
                    if (Check_Internet_Con.isConnectingToInternet(getActivity())) { 
                        new PostSignOnDuty().execute(); 
                    } else {
                        Toast.makeText(getActivity(), "Please check your Internet Connection", Toast.LENGTH_LONG).show();
                    }
                } else {
                    errorMsg.showErrorMsg(getActivity(), view, fieldsValidation());
                }
    }

    private class PostSignOnDuty extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getActivity());
            pDialog.setMessage("Submitting Details..");
            pDialog.setCancelable(false);
            pDialog.show();
        }

        @Override
        protected String doInBackground(String... arg0) {
            dutyId = sharedPreference.getDutyTypeId();
            userId = sharedPreference.getUserId();
            deviceId = simAndDeviceId.getDeviceId();
            stnCode = selectStn.getText().toString();
            signOnComments = edtPurpose.getText().toString();
            btnSignOn.setClickable(false);
            btnSignOn.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimaryDark));
            try {
                if (coordinates.getLocation() != null) {
                    latitute = coordinates.getLocation().getLatitude();
                    longitute = coordinates.getLocation().getLongitude();
                    Get_Address get_address = new Get_Address(getActivity(), latitute, longitute);
                    city = get_address.getCity();
                    state = get_address.getState();
                    area = get_address.getArea();
                    completeAddress = get_address.getCompleteAddress();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            String Url_Sign_On_Duty = getResources().getString(R.string.Url_Sign_On_Duty);

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("userid", String.valueOf(userId)));
            params.add(new BasicNameValuePair("longitude", String.valueOf(longitude)));
            params.add(new BasicNameValuePair("latitude", String.valueOf(latitude)));
            params.add(new BasicNameValuePair("deviceid", deviceId));
            params.add(new BasicNameValuePair("stationcode", stnCode));
            params.add(new BasicNameValuePair("DutyId", String.valueOf(dutyId)));
            params.add(new BasicNameValuePair("RouteTypeId", "0"));
            params.add(new BasicNameValuePair("Area", area));
            params.add(new BasicNameValuePair("City", city));
            params.add(new BasicNameValuePair("State", state));
            params.add(new BasicNameValuePair("Address", completeAddress));
            params.add(new BasicNameValuePair("Comment", signOnComments));
            ServiceHandler jsonParser = new ServiceHandler();
            String json = jsonParser.makeGetServiceCall(Url_Sign_On_Duty, ServiceHandler.POST, params);
            return json;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (pDialog.isShowing())
                pDialog.dismiss();

            loginStatusTime = Integer.parseInt(result);
            sharedPreference.setLoginstatusid(loginStatusTime);
            sharedPreference.setActiveUserId(1);
            if (loginStatusTime > 0) {
                try {
                    if (coordinates.getLocation() != null) {
                        coordinates.getLocation();
                    }

                } catch (IOException e) {
                    e.printStackTrace();
                }
                /*getActivity().startService(new Intent(getActivity(), GPS_Service.class));
                getActivity().startService(new Intent(getActivity(), Send_Records_Service.class));*/
                Toast.makeText(getActivity(), "You have Signed on at " + stnCode + " at " + getSignOnTime() + " hours", Toast.LENGTH_LONG).show();
                Intent intent = new Intent(getActivity(), SignOfDuty.class);
                startActivity(intent);
            } else {
                Log.e("JSON Data", "Didn't receive any data from server!");
            }
        }
    }

无法从
doInBackground()
方法对
UI线程执行操作。因为安卓UI工具包不是线程安全的。因此,您不应该从工作线程操纵
UI

使用

你的
背景应该是-:

@Override
        protected String doInBackground(String... arg0) {

            runOnUiThread(new Runnable() {
                public void run() {                        
                dutyId = sharedPreference.getDutyTypeId();
                userId = sharedPreference.getUserId();
                deviceId = simAndDeviceId.getDeviceId();
                stnCode = selectStn.getText().toString();
                signOnComments = edtPurpose.getText().toString();
                btnSignOn.setClickable(false);


        btnSignOn.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimaryDark));
        try {
            if (coordinates.getLocation() != null) {
                latitute = coordinates.getLocation().getLatitude();
                longitute = coordinates.getLocation().getLongitude();
                Get_Address get_address = new Get_Address(getActivity(), latitute, longitute);
                city = get_address.getCity();
                state = get_address.getState();
                area = get_address.getArea();
                completeAddress = get_address.getCompleteAddress();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
 }
            });
        String Url_Sign_On_Duty = getResources().getString(R.string.Url_Sign_On_Duty);

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("userid", String.valueOf(userId)));
        params.add(new BasicNameValuePair("longitude", String.valueOf(longitude)));
        params.add(new BasicNameValuePair("latitude", String.valueOf(latitude)));
        params.add(new BasicNameValuePair("deviceid", deviceId));
        params.add(new BasicNameValuePair("stationcode", stnCode));
        params.add(new BasicNameValuePair("DutyId", String.valueOf(dutyId)));
        params.add(new BasicNameValuePair("RouteTypeId", "0"));
        params.add(new BasicNameValuePair("Area", area));
        params.add(new BasicNameValuePair("City", city));
        params.add(new BasicNameValuePair("State", state));
        params.add(new BasicNameValuePair("Address", completeAddress));
        params.add(new BasicNameValuePair("Comment", signOnComments));
        ServiceHandler jsonParser = new ServiceHandler();
        String json = jsonParser.makeGetServiceCall(Url_Sign_On_Duty, ServiceHandler.POST, params);
        return json;
    }

您不能禁用
按钮
doInBackground()
方法
onPreExecute()
就是为它准备的。禁用
按钮
onPreExecute()
,然后再次启用它
onPostExecute()
,web上的所有教程都建议您这样做,您也可以在这些方法中设置
progressBar
,同时以其他方式设置按钮


你的问题与此无关。这是关于一个
线程
没有
活套
并试图在没有
活套的情况下发送消息或
后运行
。您正在异步任务的线程中请求更新。相反,您应该在UI线程上请求它,而不是每次请求位置更新时都在方法内部请求它。侦听器或回调必须注册
onResume()
和取消注册
onPause()
方法。

“btnSignOn.setClickable(false);”。。您不能从后台线程访问Ui元素。在OnPreExecute()中执行所有与Ui相关的任务。@ADM,已尝试但不工作是否从doInBackground()中删除所有与Ui相关的行?还有一个吗?是的,我试过了。getActivity().runOnUiThread(new Runnable(){public void run(){//some code#3(在此处编写代码以在UI线程中运行)btnSignOn.setClickable(false);});尝试将所有字符串值包装在runonuithread中,就像在我的更新应答中一样。当get coordinates函数尝试从location类获取位置时,它会引发java.lang.RuntimeException异常:无法在未调用MLLocationManager.requestLocationUpdates中的Looper.prepare()的线程内创建处理程序(LocationManager.GPS_PROVIDER,60_秒,0,this);或者您不应该在doInBackground()方法中更新这些值。请尝试在doInBackground之外更新这些变量,就像在OnCreate()中一样method@user7348352最好设置view-onPreExecute()和onPostExecute().正如您从tutorails中学到的,由于您在这些方法中使用progressBar,所以这些方法是用于的。它们在doInBackground()时在UI线程上运行在单独的线程中运行。使用runOnUIThread没有错,但正确的方法是使用其他方法,它与设置progressBar的其余代码更一致。它甚至在ServiceHandler()之前抛出异常被调用您可能正在另一个线程中注册LocationManager,但不启动循环器或不使用HandlerThread。
runOnUiThread(new Runnable() {
     public void run() {
        // some code #3 (Write your code here to run in UI thread)

       }
});
@Override
        protected String doInBackground(String... arg0) {

            runOnUiThread(new Runnable() {
                public void run() {                        
                dutyId = sharedPreference.getDutyTypeId();
                userId = sharedPreference.getUserId();
                deviceId = simAndDeviceId.getDeviceId();
                stnCode = selectStn.getText().toString();
                signOnComments = edtPurpose.getText().toString();
                btnSignOn.setClickable(false);


        btnSignOn.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorPrimaryDark));
        try {
            if (coordinates.getLocation() != null) {
                latitute = coordinates.getLocation().getLatitude();
                longitute = coordinates.getLocation().getLongitude();
                Get_Address get_address = new Get_Address(getActivity(), latitute, longitute);
                city = get_address.getCity();
                state = get_address.getState();
                area = get_address.getArea();
                completeAddress = get_address.getCompleteAddress();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
 }
            });
        String Url_Sign_On_Duty = getResources().getString(R.string.Url_Sign_On_Duty);

        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("userid", String.valueOf(userId)));
        params.add(new BasicNameValuePair("longitude", String.valueOf(longitude)));
        params.add(new BasicNameValuePair("latitude", String.valueOf(latitude)));
        params.add(new BasicNameValuePair("deviceid", deviceId));
        params.add(new BasicNameValuePair("stationcode", stnCode));
        params.add(new BasicNameValuePair("DutyId", String.valueOf(dutyId)));
        params.add(new BasicNameValuePair("RouteTypeId", "0"));
        params.add(new BasicNameValuePair("Area", area));
        params.add(new BasicNameValuePair("City", city));
        params.add(new BasicNameValuePair("State", state));
        params.add(new BasicNameValuePair("Address", completeAddress));
        params.add(new BasicNameValuePair("Comment", signOnComments));
        ServiceHandler jsonParser = new ServiceHandler();
        String json = jsonParser.makeGetServiceCall(Url_Sign_On_Duty, ServiceHandler.POST, params);
        return json;
    }
 if (isGPSEnabled) {
                mLocationManager.requestLocationUpdates(
                        LocationManager.GPS_PROVIDER, SIXTY_SECONDS,
                        0, this,Looper.getMainLooper());