指向Asynctask的Activity

时间:2014-12-30 09:09:05

标签: java android multithreading android-asynctask

这是LoginActivty

public class MainActivity extends Activity {

    ProgressDialog prgDialog;
    TextView errorMsg;
    EditText emailET;
    EditText pwdET;

    Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);


        errorMsg = (TextView) findViewById(R.id.login_error);
        emailET = (EditText) findViewById(R.id.loginEmail);
        pwdET = (EditText) findViewById(R.id.loginPassword);
        prgDialog = new ProgressDialog(this);
        prgDialog.setMessage("Please wait...");
        prgDialog.setCancelable(false);

        button = (Button) findViewById(R.id.btnLogin);

        final Button button = (Button) findViewById(R.id.btnLogin);
        button.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                try {

                    // Get Email Edit View Value
                    String email = emailET.getText().toString();
                    // Get Password Edit View Value
                    String password = pwdET.getText().toString();

                    // When Email Edit View and Password Edit View have values
                    // other than Null
                    if (Utility.isNotNull(email) && Utility.isNotNull(password)) {
                        // When Email entered is Valid
                        if (Utility.validate(email)) {

                            // call the async task

                            JSONObject js = new HttpAsyncTask(
                                    getApplicationContext()).execute(email,
                                            password).get();

                            Toast.makeText(getApplicationContext(),
                                    "Asynctask started", Toast.LENGTH_SHORT)
                                    .show();

                        }
                        // When Email is invalid
                        else {
                            Toast.makeText(getApplicationContext(),
                                    "Please enter valid email",
                                    Toast.LENGTH_LONG).show();
                        }
                    }
                    // When any of the Edit View control left blank
                    else {
                        Toast.makeText(
                                getApplicationContext(),
                                "Please fill the form, don't leave any field blank",
                                Toast.LENGTH_LONG).show();
                    }
                } catch (Exception ex) {

                }

            }
        });

        TextView registerScreen = (TextView) findViewById(R.id.link_to_register);

        // Listening to register new account link
        registerScreen.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // Switching to Register screen
                Intent i = new Intent(getApplicationContext(),
                        RegisterActivity.class);
                startActivity(i);
            }
        });
    }

}

然后我使用AsyncTask,这是代码

public class HttpAsyncTask extends AsyncTask<String, Integer, JSONObject> {

    private static InputStream stream = null;
    private static String API;
    private JSONObject responseJson = null;
    private Context contxt;
    private Activity activity;

    public HttpAsyncTask(Context context) {

        // API = apiURL;
        this.contxt = context;
    }

    // async task to accept string array from context array
    @Override
    protected JSONObject doInBackground(String... params) {

        String path = null;
        String response = null;
        HashMap<String, String> request = null;
        JSONObject requestJson = null;
        DefaultHttpClient httpClient = null;
        HttpPost httpPost = null;
        StringEntity requestString = null;
        ResponseHandler<String> responseHandler = null;

        // get the username and password
        Log.i("Email", params[0]);
        Log.i("Password", params[1]);

        try {

            path = "http://192.168.x.xxx/xxxxService/UserAuthentication";
            new URL(path);
        } catch (MalformedURLException e) {

            e.printStackTrace();
        }

        try {

            // set the API request
            request = new HashMap<String, String>();
            request.put(new String("Email"), params[0]);
            request.put(new String("Password"), params[1]);
            request.entrySet().iterator();

            // Store locations in JSON
            requestJson = new JSONObject(request);
            httpClient = new DefaultHttpClient();
            httpPost = new HttpPost(path);
            requestString = new StringEntity(requestJson.toString());

            // sets the post request as the resulting string
            httpPost.setEntity(requestString);
            httpPost.setHeader("Content-type", "application/json");

            // Handles the response
            responseHandler = new BasicResponseHandler();
            response = httpClient.execute(httpPost, responseHandler);

            responseJson = new JSONObject(response);

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
        try {
            responseJson = new JSONObject(response);

        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        return responseJson;

    }

    @Override
    protected void onPostExecute(JSONObject result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

        String myResJson;
        try {

            myResJson = responseJson.getString("status");
            String test = myResJson;
            if (test.equals("200")) {
                Log.i("Login Success", "Success message");

            } else {
                Log.e("Login Error", "Error converting result ");
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

当我输入正确的电子邮件和密码时,它就到了这一行

Log.i("Login Success", "Success message");

从那里我想打开HomeActivty,但它不允许我使用意图,甚至不能干杯

一旦日志记录成功,我需要帮助实现指向Home Activity。

3 个答案:

答案 0 :(得分:0)

你可以从AsyncTask开始这样的活动,你应该使用上下文。

mContext.startActivity(new Intent(CurrentActivity.this, Home.class));

或者尝试这样

Intent intent = new Intent();
intent.setClass(getApplicationContext(),Home.class);
startActivity(intent);

答案 1 :(得分:0)

下面:

 JSONObject js = new HttpAsyncTask(
                                getApplicationContext()).execute(email,
                                        password).get();

因为您通过调用AsyncTask.get()方法AsyncTask在主要主题上获得结果。

首先调用AsyncTask.execute方法启动AsyncTask任务:

new HttpAsyncTask(MainActivity.this).execute(email,password);

然后使用onPreExecute()显示progessbar和onPostExecute以启动下一个活动:

    @Override
    protected void onPreExecute() {
         // show ProgressDialog  here
    }
    @Override
    protected void onPostExecute(Void result) {
        // parse json here and start Home Activity
       //.........your code here
       if (test.equals("200")) {
            Log.i("Login Success", "Success message");
            Intent intent = new Intent(contxt,HomeActivity.class);
            contxt.startActivity(intent);
        } else {
            Log.e("Login Error", "Error converting result ");
        }

     }

答案 2 :(得分:0)

我知道还有另一个有效的答案来解决您的问题。但为了准确解释为什么你的错误存在,我在下面给出答案。

要为Intent创建startActivity(),可以通过以下方式完成:

Intent i = new Intent(currentActivity, NextActivity.class);
startActivity(i);

请注意Intent的构造函数的第一个参数是android.content.Context,其中Activity是它的子类。因此,在任何情况下,您始终可以将Context传递到自定义类并开始新的Activity或使用此Toast创建Context

在您的问题中,private Context contxt;中的HttpAsyncTask是您需要做的所有事情。

参考:http://developer.android.com/reference/android/content/Intent.html#Intent%28android.content.Context,%20java.lang.Class%3C?%3E%29