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



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

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

但是,当我尝试在doInBackgroundtry catch内获得location coordinates时,我收到以下错误:

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!");
            }
        }
    }

这是我的位置类。

public android.location.Location getLocation() throws IOException {
        try {
            mLocationManager = (LocationManager) context
                    .getSystemService(LOCATION_SERVICE);
            // getting GPS status
            isGPSEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
            // getting network status
            isNetworkEnabled = mLocationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            if (!isGPSEnabled && !isNetworkEnabled) {
                // location service disabled
            } else {
                this.canGetLocation = true;
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    mLocationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER, SIXTY_SECONDS,
                            0, this);
                    Log.d("GPS Enabled", "GPS Enabled");
                    if (mLocationManager != null) {
                        location = mLocationManager
                                .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        //updateGPSCoordinates();
                    }
                }
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    if (location == null) {
                        mLocationManager.requestLocationUpdates(
                                LocationManager.NETWORK_PROVIDER,
                                SIXTY_SECONDS,
                                0, this);
                        Log.d("Network", "Network");
                        if (mLocationManager != null) {
                            location = mLocationManager
                                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            //updateGPSCoordinates();
                        }
                    }
                }
            }
        } catch (Exception e) {
            // e.printStackTrace();
            Log.e("Error : Location",
                    "Impossible to connect to LocationManager", e);
        }

        return location;
    }

不能从doInBackground()方法对UI Thread执行操作。因为安卓UI工具包不是thread-safe。因此,您不应从工作线程操作UI

从文档

runOnUiThread(new Runnable() {
     public void run() {
        // some code #3 (Write your code here to run in UI thread)
       }
});

您的doInBackground应该是-:,

@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());

不得禁用button doInBackground()方法。 onPreExecute()就是为了它。禁用button onPreExecute(),然后再次启用它 onPostExecute() ,网络上的所有教程都建议您这样做,您也在这些方法中设置progressBar一些doInBackground()而设置按钮的其他方式。

你的问题不是关于这个。这是关于一个没有Looper并试图在没有Looper的情况下发送消息或postRunnableThread。您正在请求 AsyncTask 线程中的更新。相反,您应该在 UI 线程上请求它,而不是在每次请求位置更新时在方法中请求它。侦听器或回调必须注册onResume()和未注册onPause()方法。

最新更新