こんにちは、私はアンドロイドで新しく、ボタンをクリックして2つのWebサービスを開始する必要があります。 最初に1つのサービスを呼び出す必要があり、そのサービスの応答に依存する必要があります。 2番目のサービスを定期的に呼び出す必要があるため、スレッドを使用して2番目のサービスを開始する必要があります。以下 は私のstartWorkボタン(のstartWorkのクリックで呼び出さchangeworkstatus機能)をクリックしたときに私は、実行時例外を以下しまっクリックコード他のスレッドからスレッドを作成すると例外が発生しますLooper.prepare()を呼び出さなかったスレッド内でハンドラを作成できません
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class startWork extends Activity implements LocationListener {
private LocationManager locationManager;
private MyProgressDialog progressDialog;
private String provider;
private static ProgressDialog progDailog;
public static String latitude = "0";
public static String longitude = "0";
public static String userid = "";
public static String password = "";
public static String activationid = "";
public static long locationSendingPeriod = 1000;
public static String role = "Driver";
public static int j = 0;
public static int i = 0;
static final String ACTION = "com.google.android.c2dm.intent.RECEIVE";
private Handler mHandler = new Handler();
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
long millis = SystemClock.uptimeMillis();
int seconds = (int) (millis/1000);
int minutes = seconds/60;
seconds = seconds % 60;
// put your code below to run every second
try {
// latitude = "31.794483";
// longitude = "34.641747";
String DriverUpdateXml = soapXml.getDriverUpdateLocation(
startWork.userid, startWork.password,
startWork.activationid, startWork.role, latitude,
longitude);
Soap.getSoapResponse(DriverUpdateXml);
} catch (Exception e) {
// TODO Auto-generated catch block
}
// end put your code below to run every second
mHandler.postAtTime(this, startWork.locationSendingPeriod
+ (((minutes * 60) + seconds + 1) * 1000));
}
};
**// this is my method which is call onclick of button**
public void changeWorkStatus(View view) throws ClientProtocolException,
IOException {
progressDialog = new MyProgressDialog(this);
new Thread(new Runnable() {
public void run() {
try {
// progressHandler.postDelayed(progressUpdate, 100);
// progDailog = ProgressDialog.show(this, "", "");
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(startWork.this);
Button btnWork = (Button) findViewById(R.id.buttonStartWork);
String workText = btnWork.getText().toString();
String start_work = getResources().getString(
R.string.start_work);
String finish_work = getResources().getString(
R.string.finish_work);
String userid = prefs.getString(CreateDriver.PREFS_UserId,
"");
String password = prefs.getString(
CreateDriver.PREFS_Password, "");
String activationid = prefs.getString(
CreateDriver.PREFS_ActivationId, "");
String role = "Driver";
if (workText.equals(start_work)) {
// LocationManager mlocManager = (LocationManager)
// getSystemService(Context.LOCATION_SERVICE);
// LocationListener mlocListener = new
// taxiLocationListener();
// mlocManager.requestLocationUpdates(
// LocationManager.GPS_PROVIDER, 1000, (float) 0.01,
// mlocListener);
// String latitude = "31.794483";
// String longitude = "34.641747";
String DriverChangeStatus = soapXml.getDriverLogIn(
userid, password, activationid, role,
latitude.toString(), longitude.toString());
String resp = Soap.getSoapResponse(DriverChangeStatus);
org.w3c.dom.Document doc = XMLfunctions
.XMLfromString(resp);
NodeList nodes = doc.getElementsByTagName("Status");
Element elem = (Element) nodes.item(0);
String opt = XMLfunctions.getValue(elem, "Status");
nodes = doc
.getElementsByTagName("LocationSendingPeriod");
elem = (Element) nodes.item(0);
locationSendingPeriod = Long.valueOf(XMLfunctions
.getValue(elem, "LocationSendingPeriod")) * 1000;
if (opt.equals("Success")) {
String status = "Available";
String DriverAvailable = soapXml
.getDriverChangeStatus(userid, password,
activationid, role, status);
Soap.getSoapResponse(DriverAvailable);
btnWork.setText(finish_work);
btnWork.setBackgroundResource(R.drawable.btn_end);
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.post(mUpdateTimeTask);
}
} else {
mHandler.removeCallbacks(mUpdateTimeTask);
String DriverChangeStatus = soapXml.getDriverLogOut(
userid, password, activationid, role);
String resp = Soap.getSoapResponse(DriverChangeStatus);
org.w3c.dom.Document doc = XMLfunctions
.XMLfromString(resp);
NodeList nodes = doc.getElementsByTagName("Status");
Element elem = (Element) nodes.item(0);
String opt = XMLfunctions.getValue(elem, "Status");
if (opt.equals("Success")) {
btnWork.setText(start_work);
btnWork.setBackgroundResource(R.drawable.btn_more_yellow);
}
}
// progressHandler.removeCallbacks(progressUpdate);
} catch (Exception e) {
new AlertDialog.Builder(startWork.this)
.setMessage(e.toString())
.setNeutralButton("OK", null).show();
}
progressDialog.dismiss();
}
}).start();
}
public void onLocationChanged(Location location) {
latitude = String.valueOf(location.getLatitude());
longitude = String.valueOf(location.getLongitude());
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
}
に私です。
Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません 私の質問は上記のエラーを解決する方法ですか?
私の質問が更新されます。私を助けてください。 –