基于处理程序句柄消息启动意图

时间:2012-06-13 20:29:53

标签: android multithreading android-activity handler message

我有一个登录Web服务的应用程序。单击登录按钮时,我启动一个新线程,并在设备与服务器通信时显示进度对话框。根据尝试的成功或失败,我将消息发送给处理程序1 - 成功和-1 -failure。但是如何基于此消息创建并启动新意图?或者我应该如何处理这种情况。这是我的登录活动代码:

public class Login extends Activity implements OnClickListener {

private static final int DIALOG = 0;
private static String TAG="LoginActivity";
private ProgressDialog progressDialog;

private final Handler handler =  new Handler() {
    public void handleMessage(Message msg) {

        int state = msg.arg1;
        if (state != 0)
        {
            Log.i(TAG, "dialog dismissed, message received "+state);
            dismissDialog(DIALOG);
        }


    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.login);

    View loginButton = findViewById(R.id.login_button);
    loginButton.setOnClickListener(this);

}

public void onClick(View v) {

    switch (v.getId()) {
    case R.id.login_button:
        Log.i(TAG,"login button");
        showDialog(DIALOG);

        Intent i = new Intent(this, PTVActivity.class);
        startActivity(i);
        break;

    }
}

protected Dialog onCreateDialog(int id)
{
    switch(id) {
    case DIALOG:
        progressDialog = new ProgressDialog(Login.this);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        progressDialog.setMessage(getString(R.string.login_progress));
        return progressDialog;
    default:
        return null;
    }
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    switch(id) {
    case DIALOG:

        EditText nameText=(EditText)findViewById(R.id.login_name);
        EditText pwText=(EditText)findViewById(R.id.password);
        String name = nameText.getText().toString();
        String pw = pwText.getText().toString();

        CommunicateServer communicate= new CommunicateServer(name,pw,handler);
        communicate.run();
    }


}

}

这是我的CommunicateServer类的run()方法:

@Override
public void run() {


    Message msg = handler.obtainMessage();
    if (login()==true)msg.arg1 = 1;
    else msg.arg1 = -1;
    handler.sendMessage(msg);

}

1 个答案:

答案 0 :(得分:0)

要创建新的Intent并开始一项活动,您必须执行以下操作:

Intent intent = new Intent(Login.this, anotherActivity.class);
startActivity(intent);

处理此类工作的最简单方法是使用AsyncTask (example)

在您的情况下,您必须在AsyncTask的 onPreExecute()方法中显示“进度”对话框。

doInBackground(..)中,您将进行服务器调用以进行身份​​验证。您必须从doInBackground(..)方法返回状态(1或-1)。

最后,您将获得 onPostExecute(..)方法中的状态值(1或-1)作为参数。在这里,您将根据状态做出决定。如果为1,您将创建一个打开活动的新意图。您还应该关闭此方法中的进度对话框。