如果在Android中没有收到任何响应,请停止一个帖子?

时间:2011-06-07 15:08:04

标签: android multithreading web-services

我有一个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停止线程,但没有工作。如果我在废墟中没有收到任何东西我怎么能停止线程()?感谢

2 个答案:

答案 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,有时候使用基于消息的并发。使用最适合要求的技术以及对处理程序与泛型的理解程度。