【问题标题】:How to finish execution of Async Task ?如何完成异步任务的执行?
【发布时间】:2014-04-03 04:01:57
【问题描述】:

在对我的登录进行一些检查之前,我需要完成异步任务的执行。

这是我的异步任务

@Override
    protected void onPostExecute(JSONArray jsonArray) 
    {   
        JSONObject json_data = null;
        for (int i = 0; i < jsonArray.length(); i++) {
            try {
                json_data = jsonArray.getJSONObject(i);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            try {
                for (int j=0; j<jsonArray.length(); j++){
                    /*allMatrics.add(json_data.getString("matricNos"));
                    allPasswords.add(json_data.getString("password"));*/
                    if (user.equals(json_data.get("matricNos")) && pass.equals(json_data.get("password")))
                    {
                        ok = true;
                        System.out.println("hi i am ok");
                        break;
                    }
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println("Checking ok = "+ ok);
    }

我需要在检查它的状态之前完成这个异步任务,然后继续我的登录身份验证。它应该在登录按钮的onclick上执行

login.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v) 
            {
                user = uedit.getText().toString();
                pass = pedit.getText().toString();


                if (user.equals(""))
                {
                    Toast error = Toast.makeText(LogInScreen.this, "Enter Details", Toast.LENGTH_SHORT);error.show();
                }
                else
                {
                    final GetMatricNos mat = new GetMatricNos();
                    mat.execute(new ServerConnector());
                    // have to finish task before enter user, have to implement logout as well
                    if ((mat.getStatus().equals(AsyncTask.Status.RUNNING))) - This has to be Status.FINISHED
                    {
                        System.out.println(ok);
                        /*  if ((allMatrics.contains(user) && (allPasswords.contains(pass)))) */
                        if (ok)
                        {               
                            Intent homescreen = new Intent(LogInScreen.this, HomeScreen.class);
                            homescreen.putExtra("username", user);
                            startActivity(homescreen);

                        }
                        else
                        {
                            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(LogInScreen.this);
                            alertDialogBuilder.setTitle(Html.fromHtml("<font color='#D41E46'>Invalid Login Details</font>"));
                            alertDialogBuilder
                            .setMessage("The login credentials you have entered are invalid. Please try again.")
                            .setIcon(R.drawable.alert)
                            .setCancelable(false)
                            .setPositiveButton("OK",new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,int id) {
                                    dialog.cancel();
                                }
                            });
                            AlertDialog alertDialog = alertDialogBuilder.create();
                            alertDialog.show();
                        }
                    }               
                }
            }
        });
        ActionBar actionBar = getActionBar();   
        actionBar.hide();   // To hide the actionBar on LoginScreen
    }

现在如果我在检查之前没有完成任务,它不会让我检查我从编辑框中获得的凭据,但是如果我第一次登录它不会进行检查,因为任务按下登录按钮时运行,但如果我第二次登录,它会通过......?

任何帮助将不胜感激,我在检查前尝试了 task.cancel(true) 但这没有帮助...

【问题讨论】:

  • 如果您的任务与您的Activity 是一个单独的文件,那么see this answer about using an interface 并在您的回调方法中放置要运行的代码。否则,将代码运行在onPostExecute()

标签: android android-asynctask


【解决方案1】:

如果您的任务需要在您执行任何其他操作之前完成执行,那么您必须将必须等待的代码放入您的onPostExecute,当任务完成时会调用该代码

【讨论】:

  • 问题是我需要 edintext 框中的“用户”值传入protected JSONArray doInBackground(ServerConnector... params) { return params[0].GetMatricNos(user); },所以如果我在 onPostExecute 中执行此操作,我不会将任何值传递给我在 php 中的查询从这里开始。
  • 异步任务是否在单独的文件中?你总是可以在执行方法中发送你需要的东西
  • 不在同一类
  • 然后只保留一个类范围的变量,然后在 onPostExecute 中获取它
  • 谢谢我已经解决了,谢谢你的帮助,但有一个小问题@tyczj 我如何让它停止崩溃因为这个protected JSONArray doInBackground(ServerConnector... params) { if (user.equals("") || pass.equals("")) { Toast.makeText(LogInScreen.this, "Please Enter Credentials", Toast.LENGTH_SHORT).show(); return null; } else { return params[0].GetMatricNos(user); } }我必须返回一些东西..?它不需要 null 它只是崩溃
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多