0

Web サーバーにログインしようとしていて、コードは正しく実行されていましたが、その周りにログイン ページを作成しようとすると、問題が発生し始めました。

誰かが追加のコードを見たい場合は、Eclipse Android ツールで提供されているサンプルのログイン ページを使用していました。

OnClickHandler 内から実行すると、DefaultHttpClient がタイムアウトしたように見えます。何も返さないか、返された場合は「ピア証明書がありません」が返されますが、これは間違っていることがわかっています。

/**
 * Keep track of the login task to ensure we can cancel it if requested.
 */
private UserLoginTask mAuthTask = null;

... ものを設定する

    mAuthTask = new UserLoginTask();
    findViewById(R.id.sign_in_button).setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(attemptLogin()){
                        mAuthTask.execute();
                    }
                }
            });
    //mAuthTask = new UserLoginTask(); 
    //mAuthTask.execute();  // Works if called from here.

関連する AsyncTask コードは次のとおりです。

public class UserLoginTask extends AsyncTask<String, Void, String> {

    @Override
    protected void onPreExecute() {
        Log.i(TAG,"Thread name (from preexecute) : " +  Thread.currentThread().getName());
    }

    protected String doInBackground(String... urls) {
        DefaultHttpClient client = AppHttpClient.getClient();
        HttpPost httppost = new HttpPost("https://euw.leagueoflegends.com/user/login");
        String result = "";
        try {
            // Add your data
            List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
            nameValuePairs.add(new BasicNameValuePair("name", "exampleusername"));
            nameValuePairs.add(new BasicNameValuePair("pass", "blahblah"));
            nameValuePairs.add(new BasicNameValuePair("form_id", "user_login"));
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

            // Execute HTTP Post Request
            Log.i(TAG,"Thread name (passed into doInBackground) : " +  urls[0]);
            Log.i(TAG,"Thread name (from doInBackground) : " +  Thread.currentThread().getName());
            HttpResponse response2 = client.execute(httppost);
            InputStream in = response2.getEntity().getContent();
            //result = readStream(in);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    @Override
    protected void onPostExecute(final String success) {
        mAuthTask = null;
        showProgress(false);
    }

    @Override
    protected void onCancelled() {
        mAuthTask = null;
        showProgress(false);
    }
}
4

1 に答える 1

0

これは、Google エンジニアからの興味深い回答です。

AsyncTask の pre および postExecute メソッドは、タスク インスタンスが作成されたスレッドで呼び出されます。execute() をどこで呼び出すかは問題ではありません。タスクを作成するスレッドはルーパー スレッドである必要があり、実際には常にメイン スレッド (または UI スレッド) である必要があります。

編集:

このコードを試す必要があります (テストされていません):

private mAuthTask = new UserLoginTask();
findViewById(R.id.sign_in_button).setOnClickListener(
        new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(attemptLogin()){
                    Activity.this.runOnUiThread( new Runnable() {
                        @Override
                        public void run() {
                            mAuthTask.execute();
                        }
                    });
                }
            }
        });
于 2013-02-16T18:20:36.703 に答える