我正在尝试使用AsyncTask
方法将数据发送到服务器。
我正在获取所有其他设备信息和用户详细信息。
但是,当我尝试在doInBackground
的try 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
的情况下发送消息或postRunnable
的Thread
。您正在请求 AsyncTask 线程中的更新。相反,您应该在 UI 线程上请求它,而不是在每次请求位置更新时在方法中请求它。侦听器或回调必须注册onResume()
和未注册onPause()
方法。