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