java - 将值从一个 Activity 返回到另一个 Activity

标签 java android

如果用户输入错误的密码或用户名,我想显示一条消息。

这是接受值的类

    public class Login extends Activity {

    Button submit_login;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
        submit_login = (Button) findViewById(R.id.submit_login);
        submit_login.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub.
                EditText usr_number = (EditText) findViewById(R.id.username);
                EditText password_main = (EditText) findViewById(R.id.password);
                String username = usr_number.getText().toString();
                String password = password_main.getText().toString();
                String[] Loginvalues = {username,password};

                new CheckUsername().execute(Loginvalues);

            }
        });
    }

}

现在在 new CheckUsername().execute(Loginvalues) 之后;这个电话我想在 TextView 中显示一条消息(id = loginStatus)

public class CheckUsername extends AsyncTask<String, Integer, String[]> {

    HttpClient Client;
    JSONObject json;
    final static String URL = "someurl";

    @Override
    protected String[] doInBackground(String... params) {
        // TODO Auto-generated method stub
        String username = params[0].toString();
        String password = params[1].toString();
        Client = new DefaultHttpClient();
        try {
            json = ValidateUsername(username, password);

            String status = json.getString("status");
            if (status.equals("ok")) {

                System.out.println(json.getString("response"));

                JSONObject user_values = new JSONObject(json.getString("user"));

                GlobalVariables newObj = new GlobalVariables();

                newObj.setUserId(user_values.getString("id"));

                newObj.setUserName(user_values.getString("name"));

                System.out.println(newObj.getUserId());

                System.out.println(newObj.getUserName());
            } else {

            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public JSONObject ValidateUsername(String username, String password)
            throws ClientProtocolException, IOException, JSONException {
        StringBuilder url = new StringBuilder(URL);
        HttpPost post = new HttpPost(url.toString());
        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
            nameValuePairs.add(new BasicNameValuePair("token", "ABCD"));
            nameValuePairs.add(new BasicNameValuePair("func_name",
                    "validate_user"));
            nameValuePairs.add(new BasicNameValuePair("username", username));
            nameValuePairs.add(new BasicNameValuePair("password", password));
            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            HttpResponse response = Client.execute(post);
            int status = response.getStatusLine().getStatusCode();
            if (status == 200) {
                HttpEntity e = response.getEntity();
                String data = EntityUtils.toString(e);

                JSONObject statusValue = new JSONObject(data);
                return statusValue;

            } else {
                System.out.println(status);
                return null;
            }

        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;

    }

}

status.equals("ok") 这是让我们知道是否登录的标识符

谢谢

最佳答案

看来您可能误解了 AsyncTask 的功能,或者只是没有深入了解它。一个重要的澄清是 AsyncTask 不是 Activity。了解什么是 Activity 以及如何使用它与 UI 进行交互很重要(它是少数几个可以让您这样做的类之一)。

帮助解决你的问题,而不是有一个单独的类,只需将你的 AsyncTask 作为你的主类的内部类。

public class Login extends Activity {
    // Your code like onCreate and stuff

    public class CheckUsername extends AsyncTask<String[], Void, String> {
        // do your async task stuff
    }
}

扩展你的AsyncTask,在你完成后台操作后,你可以通过onPostExecute()将数据返回给你的类

public class CheckUsername extends AsyncTask<String[], Void, String> {
    @Override
    protected String doInBackground(String[]... params) {
        //... do your stuff
        return statusValue;
    }

    @Override
    protected void onPostExecute(String statusValue) {
        setText(statusValue);
    }
}

在你的主类中,有一个像setText这样的方法,它允许你根据需要处理你的返回值

public void setText(String return) {
    if (return.equals("ok") {    // or whatever it is supposed to equal if it's ok
         // set your text to whatever, you are ok
    }
    else {
         // set your text to whatever, bad password
    }
}

简而言之,AsyncTask 背后的设计思想是

public class AsyncTaskName extends AsyncTask<IN_PARAMETER, PROGRESS_PARAMETER, RETURN_PARAMETER> {
    @Override
    protected RETURN_PARAMETER doInBackground(IN_PARAMETER... params) {
         // do your stuff
         return (variable of type RETURN_PARAMETER);
    }

    @Override
    protected void onProgressUpdate(PROGRESS_PARAMETER... progress) {
         // do your stuff
    }

    @Override
    protected void onPostExecute(RETURN_PARAMETER returnParam) {
         // interact with your UI, like calling a method from your activity
    }
}

值得注意的是,任务通常不需要onProgressUpdate,除非您想直接通知​​用户您的AsyncTask的更新进度。

AsyncTasks 旨在脱离 UI 执行操作,但仍然能够轻松地与之交互。 doInBackground 方法告诉 AsyncTask 我们希望从 UI 线程完成它,但是 onPostExecute 告诉我们我们已经完成,关闭我们的线程并返回我们的数据。就 UI 交互而言,如果没有 onPostExecute,您将死死地漂浮在水中。您不必从 onPostExecute 调用方法并且可以直接使用 UI(如 textView.setText(returnValue);),但使用方法可以更清楚地表明工作是由 Activity 而不是 AsyncTask 本身完成的。

关于java - 将值从一个 Activity 返回到另一个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23957745/

相关文章:

java - 为什么我的 RecyclerView 在此 fragment 中没有显示任何内容?

java - 如何在listView中初始化项目总数和某些价格的总值(value)?

java - 如何使用 Eclipse 在一般的 java 项目(不特定于 android)中创建 SQLite 数据库?

java - 插入具有重复键的二叉搜索树?

android - 从内存中删除图像数据

android - OpenCV:查找彩色HSV的上下限

java - 使用 Open XML 更改文档的字体

java - 如何进一步调试以公开 groovy 脚本中元素中的值

java - Android 每秒更新 UI 16 次

android - 使用 firebase 手机身份验证验证失败