我有一个progressDialog,我连接到一个Web服务。虽然我没有收到回复,但是我显示了progressDialog但是如果我什么都没收到,则progressDialog不会关闭。
progressDialog = ProgressDialog.show(ProfilesMenu.this, "", Utils.CONTACT_WEBSERVICE, true);
Thread thread = new Thread(ProfilesMenu.this);
thread.start();
@Override
public void run() {
linkToWebService = new Utils();
T_VERSION version = new T_VERSION(Utils.MTA, Utils.STA);
try {
// é envio o nº de tlm do item selecionado para verificar o seu status
Vector<T_COMMAND_OUT> command = linkToWebService.getCardInfoDemand(version, "0",
profilesArrayList.get(menuInfoPosition).getPhoneNumber());
responseWebservice = command.get(0);
handler.sendEmptyMessage(0);
} catch(Exception e) {
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
progressDialog.dismiss();
if(responseWebservice.getid()==Utils.CARD_INFO_RESPONSE_ID){
if(responseWebservice.getLocked().equals(Utils.UNLOCKED)){
profilesArrayList.get(menuInfoPosition).setCalypsoNumber(responseWebservice.getCalypsoNumber());
Log.d("calypsoNumber", profilesArrayList.get(menuInfoPosition).getCalypsoNumber());
if(profilesArrayList.get(menuInfoPosition).getCalypsoNumber()!="")
profilesArrayList.get(menuInfoPosition).setState(true);
SharedPreferences preferences = getSharedPreferences(SHARED_PREFERENCES_PROFILES_NAME+getProfilesCounter(), MODE_PRIVATE);
SharedPreferences.Editor prefEdit = preferences.edit();
prefEdit.putString(CALYPSO_NUMBER, profilesArrayList.get(menuInfoPosition).getCalypsoNumber());
prefEdit.commit();
createAlertDialog("Status of Profile", "This phone number is unlocked!").setIcon(R.drawable.right_icon).show();
}else if (responseWebservice.getLocked().equals(Utils.LOCKED)) {
createAlertDialog("Status of Profile", "This phone number is locked! You have to active it " +
"for buy tickets").setIcon(R.drawable.wrong_icon).show();
}
} else if(responseWebservice.getid()==Utils.ERROR_MESSAGE_ID){
createAlertDialog(responseWebservice.getPage().getTemplateRef(), "Data not recognized by webservice.").setIcon(R.drawable.wrong_icon).show();
}
}
};
我尝试使用.sleep停止线程,但没有工作。如果我在废墟中没有收到任何东西我怎么能停止线程()?感谢
答案 0 :(得分:0)
我建议使用AsyncTask而不是Thread。它使您的生活更轻松,它为您提供了很大的灵活性,可以在另一个线程中执行批量操作,当结果可用时,您可以在UI线程中更新它。这是一个简单的例子:
public class WebOperation extends AsyncTask<Void, Void,Void> {
private final ProgressDialog mProgressDialog;
public WebOperation(Context context){
mProgressDialog = new ProgressDialog(context);
mProgressDialog.setMessage("Your Message");
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.show();//show your prorgress dialog
}
@Override
protected Void doInBackground(Void... params) {
// Do Network Related Operation
return null; //return result
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
//runs on UI Thread
mProgressDialog.dismiss();
}
}
您可以使用publishProgress和onProgressUpdate方法将进度发布到ProgressDialog。以下是AsyncTask的参考资料
http://developer.android.com/reference/android/os/AsyncTask.html
希望这有助于解决您的progressDialog问题。
答案 1 :(得分:0)
考虑在catch中调用Log.d来发现调用没有完成的原因。
然后考虑在消息中包装异常。使用message.what(ERROR_COMMAND),其中ERROR_COMMAND为1,并使用message.setData将异常描述作为不可变值包装在消息中。然后打开处理程序中的内容,捕获SUCCESS_COMMAND值为0或ERROR_COMMAND值为1的内容。
恕我直言,你有时应该使用asyncTask,有时候使用基于消息的并发。使用最适合要求的技术以及对处理程序与泛型的理解程度。