如何使用ProgressBar在从服务器等待httpResponse时显示微调器

时间:2012-05-14 13:15:02

标签: android progress-bar android-asynctask progressdialog

我正在尝试在应用程序查询在线数据库时向用户显示加载图标。我尝试过使用AnimationDrawable(我放弃了,因为不需要自定义图标),ProgressDialog和ProgressBar。 ProgressBar似乎是最合适的,因为我不想要一条消息,只是一个旋转的图标。但我甚至无法在屏幕上显示ProgressBar,无论我在哪里调用它。 我已经将ProgressDialog出现在屏幕上,但它只出现在服务器的响应之后,如果我使用dismiss()或者取消(),它甚至根本不出现。

我使用AsyncTasks或Threads取得了成功。

在应用程序中,有一个类JogarActivity.java,它试图显示一个选项列表。它接收一些参数,如用户ID,并调用UserFunctions:

public void onCreate(Bundle savedInstanceState){         super.onCreate(savedInstanceState);

    setContentView(R.layout.jogar_layout);
    Intent in = getIntent();
    String url = this.getString(R.string.urlSite);
    ArrayList<HashMap<String, String>> respostaList = new ArrayList<HashMap<String, String>>();

    String idt = in.getStringExtra(TAG_ID);
    primeiraPergunta = in.getBooleanExtra(TAG_PRIMEIRAPERGUNTA, true);

    TextView insertPergunta = (TextView) findViewById(R.id.insertPergunta);
    ListView insertRespostas = (ListView) findViewById(R.id.listResposta);

    SharedPreferences settings = getSharedPreferences("PREFS_LOGIN", MODE_PRIVATE);
    Integer idUsuario = settings.getInt("idUsuario", 0);
    String idUser = idUsuario.toString();


    if (primeiraPergunta){
        UserFunctions userFunction = new UserFunctions();
        json = userFunction.getJogar(idt, idUser);
    }else{
        try {
            json = new JSONArray(in.getStringExtra(TAG_JSON));
            json = json.getJSONArray(2);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

下面是userFunctions中的getJogar函数:  public JSONArray getJogar(String categoria,String usuarioId){         List params = new ArrayList();

    params.add(new BasicNameValuePair("categoria", categoria));
    params.add(new BasicNameValuePair("idUsuario", usuarioId));
    JSONArray json = jsonParser.getJSONFromUrl(perguntaURL, params);

    return json;
}

JSONParser.java是创建httpRequest的类: public JSONArray getJSONFromUrl(String url,List params){

    // Making HTTP request
    try {
        // defaultHttpClient
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        httpPost.setEntity(new UrlEncodedFormEntity(params));



        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();



        // json = EntityUtils.toString(httpEntity);
        // HttpEntity httpEntity2 = httpEntity;
        json = EntityUtils.toString(httpEntity);
        // is = httpEntity.getContent();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } 
            //then makes the JSON manipulation

只要JSONParser和userFunction不是活动,我就无法在其中使用ProgressDialogs(无法获取应用程序上下文)。所有服务器请求都是在JSONParser.java中生成的,这就是为什么我第一次尝试将ProgressDialog / ProgressBar放在那里。

我到达的最接近的是在JogarActivity中使用此代码(它显示了ProgressDialog,但是在获得服务器的响应之后。如果我使用dismiss,它甚至不会出现)

   final ProgressDialog loader = new ProgressDialog(JogarActivity.this);
    loader.show();
    //...the if-else code i've pasted above
    loader.dismiss();

即使使用runOnUiThread它也行不通!我没有选择......

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这有效:

public class RegisterActivity extends Activity{
EditText reg_fullname;
EditText reg_email;
EditText reg_login;
EditText reg_password;
EditText reg_password2;
Spinner reg_country;
Spinner reg_genre;
EditText reg_birthday;
EditText reg_promocode;
Button btnRegister;
Context ctx = this;
ProgressDialog pDialog;
JSONArray json;
String status;
String msg;

String fullname;
String email;
String login;
String password;
String password2;
String country;
String genre;
String birthday;
String promocode;

boolean finishActivity = false;

/**
 * @see android.app.Activity#onCreate(Bundle)
 */

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.register);

    TextView loginScreen = (TextView) findViewById(R.id.link_to_login);

    loginScreen.setOnClickListener(new View.OnClickListener() {

        public void onClick(View arg0) {
                            // Closing registration screen
            // Switching to Login Screen/closing register screen
            finish();
        }
    });

    reg_fullname = (EditText) findViewById(R.id.reg_fullname);
    reg_email = (EditText) findViewById(R.id.reg_email);
    reg_login = (EditText) findViewById(R.id.reg_login);
    reg_password = (EditText) findViewById(R.id.reg_password);
    reg_password2 = (EditText) findViewById(R.id.reg_password2); //confirmação de senha
    reg_country = (Spinner) findViewById(R.id.reg_country);
    reg_genre = (Spinner) findViewById(R.id.reg_genre);
    reg_birthday = (EditText) findViewById(R.id.reg_birthday);
    reg_promocode = (EditText) findViewById(R.id.reg_promocode);

    btnRegister = (Button) findViewById(R.id.btnRegister);


    btnRegister.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            fullname = reg_fullname.getText().toString();
            email = reg_email.getText().toString();
            login = reg_login.getText().toString();
            password = reg_password.getText().toString();
            password2 = reg_password2.getText().toString();
            country = reg_country.getSelectedItem().toString();
            genre = reg_genre.getSelectedItem().toString();
            birthday = reg_birthday.getText().toString();
            promocode = reg_promocode.getText().toString();

            boolean validation = true;
            String message = "Campo de preencimento obrigatório";

            if(fullname.equalsIgnoreCase("")){
                reg_fullname.setError(message);
                validation = false;
            }
            if(email.equalsIgnoreCase("")){
                reg_email.setError(message);
                validation = false;
            }
            if(!email.matches(".*@.*")){
                reg_email.setError("O endereço de email não é válido");
                validation = false;
            }
            if(login.equalsIgnoreCase("")){
                reg_login.setError(message);
                validation = false;
            }
            if(password.equalsIgnoreCase("")){
                reg_password.setError(message);
                validation = false;
            }
            if(password2.equalsIgnoreCase("")){
                reg_password2.setError(message);
                validation = false;
            }
            if(!password.equals(password2)){
                reg_password2.setError("A confirmação de senha não confere");
                validation = false;
            }
            if(birthday.equalsIgnoreCase("")){
                reg_birthday.setError(message);
                validation = false;
            }
            SimpleDateFormat bd = new SimpleDateFormat("dd/MM/yyyy");
            if(bd.parse(birthday, new ParsePosition(0)) == null){
                reg_birthday.setError("Esta data não é válida! Preencha novamente, usando o formato dd/mm/aaaa");
                validation = false;
            }

            if(validation){
            new Register().execute();
            }

        }
    });



}


class Register extends AsyncTask<Void, Void, JSONArray>{

@Override
protected void onPreExecute() {
    super.onPreExecute();
    pDialog = new ProgressDialog(ctx);
    pDialog.setMessage("Aguarde...");
    pDialog.setIndeterminate(true);
    pDialog.setCancelable(false);
    pDialog.show();
}

@Override
protected JSONArray doInBackground(Void... params) {
    UserFunctions userFunction = new UserFunctions();
    json = userFunction.newUser(fullname, email, login, password, country, genre, birthday, promocode);

    return json;

}

protected void onPostExecute(JSONArray result) {
    // dismiss the dialog once done
    pDialog.dismiss();
    final AlertDialog alertDialog = new AlertDialog.Builder(
            RegisterActivity.this).create();

            try {
                status = json.getString(0);
                msg = json.getString(1);
                Log.d("Status", status);
            } catch (JSONException e) {
                Log.e("RegisterActiviry", "Error converting result " + e.toString());
                e.printStackTrace();
                status = null;
            }

            if (status.equalsIgnoreCase("erro")){
                alertDialog.setTitle("Erro");
                alertDialog.setMessage(msg);

            }else if (status.equalsIgnoreCase("sucesso")){
                alertDialog.setTitle("Sucesso!");
                alertDialog.setMessage(msg);
                finishActivity = true;
            }else{
                alertDialog.setTitle("Erro");   
                alertDialog.setMessage("Não foi possível realizar seu cadastro, tente novamente mais tarde.");
            }


            alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    if(finishActivity){
                    finish();
                    }else{
                        alertDialog.dismiss();
                    }
                }
        });

        alertDialog.show();

}

}


}