ClientService的Android异步任务错误

时间:2013-03-13 19:27:25

标签: android web-services android-asynctask

我正在创建一个运行Windows服务的简单系统,其中包含一个用户表,我想通过向服务发送内容来验证某人的登录凭据。我正在尝试发送他们的用户名和密码,但我的异步任务一直出错。我知道你不应该在那里搞砸UI的东西,我不是。最初我在那里打电话给另一个活动,但我评论了它。现在doInBackground中唯一的事情是如果验证是好的,则将布尔值设置为true。从那里我在异步执行后读取值,然后将一个包放在一起移动到下一个位置。我只是不知道这里有什么问题。自从我在Android中编程以来已经有一段时间了,所以也许我错过了一些愚蠢的东西。如果有人能帮助我,我会非常感激!谢谢。这也可能是将信息发送到服务的问题?

更新:在清单中添加互联网使用后,如果我在doInBackground中的程序中有log.d,则会打印出来。如果我没有它,结果值将保持为false。看起来我的服务和Android应用程序之间的连接存在一些问题...

import java.util.ArrayList;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {
    private static final int DATA_FROM_MAIN_ACTIVITY = 1;
    private static final String SERVICEURL = "http://localhost:56638/ClientService.svc";
    private EditText userTextBox, passTextBox;
    private Button loginButton;
    private String uName, pass;
    private Boolean result = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        userTextBox = (EditText) findViewById(R.id.userTextBox);
        passTextBox = (EditText) findViewById(R.id.passTextBox);
        loginButton = (Button) findViewById(R.id.loginButton);

        loginButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                uName = userTextBox.getText().toString();
                pass = passTextBox.getText().toString();

                SendLoginMessage task = new SendLoginMessage();
                task.execute(uName, pass);

                if (result.equals(true)) {
                    Intent goToMainScreen = new Intent(getApplicationContext(),
                            MainActivity.class);
                    goToMainScreen.putExtra("username", uName);
                    goToMainScreen.putExtra("password", pass);

                    startActivityForResult(goToMainScreen,
                            DATA_FROM_MAIN_ACTIVITY);
                } else {
                    Toast.makeText(
                            getApplicationContext(),
                            "There was an issue with your username or password.",
                            Toast.LENGTH_LONG).show();
                }

            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private class SendLoginMessage extends AsyncTask<String, String, Void> {
        @Override
        protected void onPreExecute() {
            // Log.d("message almost at server, " + textFromArea, selected,
            // null);
        }

        @Override
        protected Void doInBackground(String... names) {
            ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>();
            postParams.add(new BasicNameValuePair("username", names[0]));
            postParams.add(new BasicNameValuePair("password", names[1]));

            String response = null;

            try {
                response = HttpClient.executeHttpPost(SERVICEURL, postParams);

                String newResponse = response.toString();
                newResponse = newResponse.replaceAll("\\s+", "");

                // if user was authenticated...
                if (newResponse.equals(true)) {
                    result = true;
                    // creating an intent to take user to next page.
                    // load their DB objects on the
                    // on create in other activity
                    // pass the username/password to next activity
                    // then make a request to the server for their database
                    // objects.
                    // Intent goToMainScreen = new
                    // Intent(getApplicationContext(), MainActivity.class);
                    // goToMainScreen.putExtra("username", names[0]);
                    // goToMainScreen.putExtra("password", names[1]);

                    // startActivityForResult(goToMainScreen,
                    // DATA_FROM_MAIN_ACTIVITY);
                }

            } catch (Exception e) {
                Log.d("ERROR", "exception in background");
            }

            return null;

        }

        @Override
        protected void onPostExecute(Void result) {

            // Toast.makeText(getApplicationContext(),
            // .show();

        }

    }

}

1 个答案:

答案 0 :(得分:2)

这样做:

 private class SendLoginMessage extends AsyncTask<String, String, Boolean> {
    @Override
    protected Boolean doInBackground(String... names) {
        ArrayList<NameValuePair> postParams = new ArrayList<NameValuePair>();
        postParams.add(new BasicNameValuePair("username", names[0]));
        postParams.add(new BasicNameValuePair("password", names[1]));

        String response = null;

        try {
            response = HttpClient.executeHttpPost(SERVICEURL, postParams);

            String newResponse = response.toString();
            newResponse = newResponse.replaceAll("\\s+", "");

            // if user was authenticated...
            if (newResponse.equals("true")) {
                return true;
            }

        } catch (Exception e) {
            Log.d("ERROR", "exception in background");
        }

        return false;

    }

    @Override
    protected void onPostExecute(Boolean result) {
            if (result) {
                Intent goToMainScreen = new Intent(getApplicationContext(),
                        MainActivity.class);
                goToMainScreen.putExtra("username", uName);
                goToMainScreen.putExtra("password", pass);

                startActivityForResult(goToMainScreen,
                        DATA_FROM_MAIN_ACTIVITY);
            } else {
                Toast.makeText(
                        getApplicationContext(),
                        "There was an issue with your username or password.",
                        Toast.LENGTH_LONG).show();
            }
    }

}

并在您的onClick()中致电execute()

 uName = userTextBox.getText().toString();
 pass = passTextBox.getText().toString();

 SendLoginMessage task = new SendLoginMessage();
 task.execute(uName, pass);

执行完成后,onPostExecute()将被调用,Activity将根据结果变量启动。

调用execute()后不要检查结果变量,因为execute()是异步调用的。当您检查全局结果变量时,doInBackground()可能尚未完成。使用我的方法,您不需要全局变量。在使用任何组件之前,请仔细阅读文档。