سؤال

I have this code for send sign in request:

@Override
public void onClick(View arg0) {

    switch(arg0.getId()) {

        case R.id.signInButton: 
            new AsyncSignIn().execute();
            break;

        default: 
            break;
    }
}

private class AsyncSignIn extends AsyncTask<Void, Void, Void> {

    protected Void doInBackground(Void...voids) {
        try {
            String email = eField.getText().toString();
            String password = pField.getText().toString();
            if(isOnline(getApplicationContext())) {
                if(!Requester.signIn(email, password)) {
                    makeToast("Неверный логин или пароль.");
                }
                else {
                    _userEmail = email;
                    startMainContentActivity();
                }
            }
            else {
                makeToast("Нет доступа к интернету.");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }           
        return null;
    }

}

But application crashes with the exception of NetworkOnMainThread:

01-24 20:04:15.248: E/AndroidRuntime(758): android.os.NetworkOnMainThreadException

In fact at this string where "handle" is an HttpURLConnection object:

 DataOutputStream writer = new DataOutputStream(handle.getOutputStream());

I have already tried to use Handler for this, but there was the same result. What's wrong?

Update

This is a function which sends post request to sign in:

protected String sendPost(String _url, String _urlParameters) throws IOException {
    URL url = new URL(_url);
    HttpURLConnection handle = (HttpURLConnection) url.openConnection();
    handle.setRequestMethod("POST");
    handle.setRequestProperty("Host", Host);
    handle.setRequestProperty("Content-Type", POSTContentType);
    handle.setRequestProperty("Content-Length", ""+_urlParameters.getBytes().length);
    handle.setRequestProperty("User-Agent", UserAgent);
    handle.setRequestProperty("Accept", Accept);
    handle.setRequestProperty("Accept-Language", AcceptLang);
    handle.setRequestProperty("Connection", Connection);
    handle.setUseCaches(false);
    handle.setDoOutput(true);
    handle.setDoInput(true);

    DataOutputStream writer = new DataOutputStream(handle.getOutputStream()); //App crashed string
    writer.writeBytes(_urlParameters);
    writer.flush();
    writer.close();
    int responseCode = handle.getResponseCode();

    if(responseCode == 200) {       
        BufferedReader reader = new BufferedReader(new InputStreamReader(handle.getInputStream())); 
        String inputLine;
        StringBuffer response = new StringBuffer();

        while((inputLine = reader.readLine()) != null) {
            response.append(inputLine);
        }
        return response.toString();
    }
    else {
        return null;
    }
}

Permissions from manifest:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> </uses-permission>

SignIn

There is no any interesting in it.

public boolean signIn(String _email, String _pass) throws IOException {
    String link = signInURL;
    String signInData = "email="+_email+"&password="+_pass;
    String response = sendPost(link, signInData);
    System.out.println(response);
    if(response.compareTo("Logged") == 0) {
        return true;
    }
    return false;
}

makeToast

The same with makeToast - nothing interesting.

protected void makeToast(String mess) {
    Toast t = Toast.makeText(getApplicationContext(), mess, Toast.LENGTH_SHORT);
    t.setGravity(Gravity.CENTER, 0, 0);
    t.show();
}
هل كانت مفيدة؟

المحلول

One problem is with:

        String email = eField.getText().toString();
        String password = pField.getText().toString();

you should not access UI from non UI thread, not sure about using getText - but its always better to make it a rule. You can read you fields in onPreExecute, also show Toast in onPostExecute of your AsyncTask.

otherwise your code looks good, you might attach full stact trace, not only one line of it

نصائح أخرى

--Check your doInBackground part i am 100% sure you show "Toast" in else part
    else {
            makeToast("Нет доступа к интернету."); <--
        }

-You can't update UI stuff in doInBackground(). Hence, you can't display a Toast there. You 
 needto   move this to onPostExecute() or somewhere else. Possibly onProgressUpdate()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top