android 进程同步等问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31390999/article/details/90717078

写项目的时候需要实现登录并人脸认证的功能,但是登录的接口只有用户名和密码,登录成功返回重要信息flag,使用虹软的人脸识别。因此想的是先判断登录然后人脸认证。出现的问题是登录后进行人脸认证。登录部分是写在线程里的,如果返回的flag不为空,表明登录成功,可以进行人脸认证,否则弹出登录失败(写在catch中是,使用了loop)。因为登录部分写在线程中,所以一开始无论是否登录成功都会进行人脸认证(线程同步,线程还没有执行完)。想了很多线程同步之类的方法,比如join()。但是这样子的话如果登录密码错误直接会挂掉(因为有loop的存在)。最后解决方法是不在catch中弹出消息,而将其写在if判断中。还是自己太差了,逻辑能力差。



import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;


import static io.agora.rtc.gl.EglBase.lock;

public class LoginActivity extends AppCompatActivity {

    private EditText login_name;
    private EditText login_pwd;
    private Button login;
    private CheckBox keep_password;
    //private Button facedector;

    private String user_id1 = "";
    private String flag = "";
    private Thread t1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_login);
        CrashReport.testJavaCrash();
        initView();


    }

        @SuppressLint("WrongViewCast")
        private void initView() {
        login_name = findViewById(R.id.login_name);
        login_name.setSelection(login_name.getText().length());
        login_pwd = findViewById(R.id.login_pwd);
        login_pwd.setSelection(login_pwd.getText().length());
        login = (Button) findViewById(R.id.login_login);
        keep_password = (CheckBox) findViewById(R.id.Login_Remember);
        boolean isKeep = ShareUtils.getBoolean(this, "keeppass", false);
        keep_password.setChecked(isKeep);


        if(isKeep){
            String name = ShareUtils.getSring(this, "login_name", "");
            String pwd = ShareUtils.getSring(this, "login_pwd", "");
            login_name.setText(name);
            login_pwd.setText(pwd);
        }
        login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                user_id1 = "";

                    //这是重点,返回flag

                    flag = sendRequestWithHttpURLConnection();



                System.out.println("flag:"+ flag);
                try {
                    //等待执行完成
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                if(flag.equals("")){
//在if判断中执行Toast
                    Toast.makeText(LoginActivity.this, "用户名或密码错误",Toast.LENGTH_LONG).show();
                    }else {
                        if( ((Application)getApplicationContext()).mFaceDB.mRegister.isEmpty() ) {
                            Toast.makeText(LoginActivity.this, "首次登录,请先注册身份信息!", Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(getApplicationContext(),IdentityActivity.class);
                            startActivity(intent);
                        }else {
                            Toast.makeText(LoginActivity.this,"请进行人脸认证",Toast.LENGTH_LONG).show();
                            new AlertDialog.Builder(LoginActivity.this)
                                    .setTitle("请选择相机")
                                    .setIcon(android.R.drawable.ic_dialog_info)
                                    .setItems(new String[]{"后置相机", "前置相机"}, new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            startDetector(which);
                                        }
                                    })
                                    .show();
                        }
                    }



                }




        });
    }


        private void startDetector(int camera) {

            Intent it = new Intent(LoginActivity.this, DetecterActivity.class);
            it.putExtra("Camera", camera);
            it.putExtra("user_id",user_id1);
            startActivityForResult(it, REQUEST_CODE_OP);
        }



    private String sendRequestWithHttpURLConnection()  {

        t1 = new Thread(new Runnable() {
            @Override
            public void run() {
             //登录操作略
                try {
                    service.getInput().put("login_name", login_name.getText().toString()); //传入登录名
                    service.getInput().put("login_pwd", login_pwd.getText().toString()); //传入登录密码
                    service.service();
                    user_id1 = service.getOutput().getString("user_id");
                    MainActivity.user_id1 = user_id1;
                    System.out.println("现在的user_id1:"+ user_id1);

                } catch (java.lang.Exception e) {
//最一开始在catch中Toast,因此需要使用 Looper.prepare()和Looper.loop();
                    //Looper.prepare();
                    e.printStackTrace();
                    //System.out.println("用户名或密码错误1");
                    Toast.makeText(LoginActivity.this, "用户名或密码错误",Toast.LENGTH_LONG).show();
                   // Looper.loop();
                }
            }
        });
        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return user_id1;
    }



        private boolean isFirst() {
            boolean isFirst = ShareUtils.getBoolean(this,StaticClass.SHARE_IS_FIRST,true);
            if(isFirst){
                ShareUtils.putBoolean(this,StaticClass.SHARE_IS_FIRST,false);
                //是第一次运行
                return true;
            }else {
                return false;
            }

        }

    //假设我现在输入用户名和密码,但是我不点击登录,而是直接退出了
    @Override
    protected void onDestroy() {
        super.onDestroy();

        //保存状态
        ShareUtils.putBoolean(this, "keeppass", keep_password.isChecked());

        //是否记住密码
        if (keep_password.isChecked()) {
            //记住用户名和密码
            ShareUtils.putString(this, "login_name", login_name.getText().toString());
            ShareUtils.putString(this, "login_pwd", login_pwd.getText().toString());
        } else {
            ShareUtils.deleteShare(this, "login_name");
            ShareUtils.deleteShare(this, "login_pwd");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_31390999/article/details/90717078