使用AsyncTask

Gar*_*ary 13 android exception android-asynctask

抱歉,如果这是一个简单的问题,但我对此很新,还在学习.

我有一个应用程序,当我的用户在输入他们的详细信息后单击按钮登录时,它崩溃与android.os.NetworkOnMainThreadException我发现这是因为我在主线程上执行网络操作并解决我需要使用AsyncTask,我被语法困住了.

单击按钮后,这是我的代码,调用函数进行连接,然后将json解析为sqlite db.

// Login button Click Event
    btnLogin.setOnClickListener(new View.OnClickListener() {

        public void onClick(View view) {
            String email = inputEmail.getText().toString();
            String password = inputPassword.getText().toString();
            UserFunctions userFunction = new UserFunctions();
            JSONObject json = userFunction.loginUser(email, password);

            // check for login response
            try {
                if (json.getString(KEY_SUCCESS) != null) {
                    loginErrorMsg.setText("");
                    String res = json.getString(KEY_SUCCESS); 
                    if(Integer.parseInt(res) == 1){
                        // user successfully logged in
                        // Store user details in SQLite Database
                        DatabaseHandler db = new DatabaseHandler(getApplicationContext());
                        JSONObject json_user = json.getJSONObject("user");

                        // Clear all previous data in database
                        userFunction.logoutUser(getApplicationContext());
                        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT));                        

                        // Launch Dashboard Screen
                        Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class);

                        // Close all views before launching Dashboard
                        dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        startActivity(dashboard);

                        // Close Login Screen
                        finish();
                    }else{
                        // Error in login
                        loginErrorMsg.setText("Incorrect username/password");
                    }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

如何将其更改为正确的课程?我没有通过URL等.我认为它需要是这样的,但我真的很难让语法正确.

非常感谢!!!

class login extends AsyncTask<Void, Void, Void> {

    private Exception exception;

    protected ??? doInBackground(???) {
        try {
Run Code Online (Sandbox Code Playgroud)

cod*_*gic 24

这将是这样的

   public class TalkToServer extends AsyncTask<Void, Void, Void> {

   @Override
   protected void onPreExecute() {
        /*
         *    do things before doInBackground() code runs
         *    such as preparing and showing a Dialog or ProgressBar
        */
   }

   @Override
   protected void onProgressUpdate(Void... values) {
        /*
         *    updating data
         *    such a Dialog or ProgressBar
        */

   }

   @Override
   protected Void doInBackground(Void... params) {
      //do your work here
      return null;
   }

   @Override
   protected void onPostExecute(Void result) {
        /*
         *    do something with data here
         *    display it or send to mainactivity
         *    close any dialogs/ProgressBars/etc...
        */
   }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以执行它

TalkToServer myTask = new MyTask(); // can add params for a constructor if needed
myTask.execute(); // here is where you would pass data to doInBackground()
Run Code Online (Sandbox Code Playgroud)

您可能不需要onProgressUpdate()或者onPreExecute()如果您没有使用它们在Dialog之前或期间显示,进度或其他任务doInBackground().

onPreExecute()可用于初始化和显示ProgressDialog.然后就可以被解雇了onPostExecute()

任务完成后

onPostExecute()将被召唤.如果该类是您的内部类,Activity则可以UI在那里更新元素,或者在任务完成后调用函数来运行代码.如果它是一个单独的文件比Activity,那么你可以使用interface和创建callBackActivity,并运行代码.有一次任务的完成.

这个答案谈到了在需要时使用接口进行回调

确保任何UI更新都以任何方法完成,doInBackground()或者发送回Activity任何函数doInBackground().应该在网络运营等方面进行繁重的工作doInBackground().

另外,请务必完整阅读AsyncTask文档.特别是线程规则