0

現在、舞台裏で実行されているスレッドを処理するための単純な非同期タスクが必要なプロジェクトを作成しています。ユーザーはログインする必要があります。PVAndroid Client という別のクラスを使用しています。このクラスは、便利なメソッドを提供し、XML シリアライザー フォーム パケットを備えています。私はスレッドの操作やサーバーで何かを行うことにまったく慣れていないため、これは完全に間違っているか、多少正しいかもしれません。

ユーザーが入力したデータを取得します。IP アドレスとポート、ユーザー名 (姓と名に分けました)、選択した地域です。パスワードを暗号化し、IP アドレスとポート番号を使用して TCP への接続を試みます。非同期タスクで作業しようとしていますが、何をすべきか混乱しています。誰かが私を正しい方向に導き、助けてくれますか?

ありがとうございます。

    private TcpClient myTcpClient = null;
    private UdpClient udpClient;
    private static final String USERNAME_SHARED_PREFS = "username";
    private static final String PASSWORD_SHARED_PREFS = "password";
    private static final String IP_ADDRESS_SHARED_PREFS = "ipAddressPref";
    private static final String PORT_SHARED_PREFS = "portNumberPref";
    private String encryptedNameLoginActivity, encryptPassLoginActivity;
    private EditText userText, passText;
    private String getIpAddressSharedPrefs, getPortNumberPrefs;
    private String getUserNameValue;
    private String getPasswordValue;
    private String fName, lName;
    private SharedPreferences settings;
    private Editor myEditor;
    private boolean getCheckedRemember;
    private boolean resultCheck = false;
    private int portNum;
    private Button submitButton;
    private String userMACVARIABLE = "";
    private String regionSelected, gridSelected;
    private Spinner regSpinner, gridSpinner;
    PVDCAndroidClient client;
    private int userNum;

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

        client = new PVDCAndroidClient();
    }

    @Override
    protected void onStart() {
        super.onStart();

        // Take care of getting user's login information:
        submitButton = (Button) findViewById(R.id.submitButton);
        userText = (EditText) findViewById(R.id.nameTextBox);
        passText = (EditText) findViewById(R.id.passwordTextBox);
        regSpinner = (Spinner) findViewById(R.id.regionSpinner);

        // grid selected as well? sometime?
        regSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View v,
                    int position, long rowId) {
                regionSelected = regSpinner.getItemAtPosition(position)
                        .toString();

            }

            @Override
            public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub
            }
        });
        submitButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                settings = PreferenceManager
                        .getDefaultSharedPreferences(AndroidClientCompnt.this);

                getIpAddressSharedPrefs = settings.getString(
                        IP_ADDRESS_SHARED_PREFS, "");
                portNum = Integer.parseInt(settings.getString(
                        PORT_SHARED_PREFS, ""));

                if (getIpAddressSharedPrefs.length() != 0 && portNum != 0) {
                    if (userText.length() != 0 && passText.length() != 0) {
                        try {

                            try {
                                // encrypting the user's password.
                                encryptPassLoginActivity = Secure.encrypt(passText
                                        .toString());
                            } catch (Exception e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                            // first connect attempt.
                            myTcpClient = new TcpClient();
                            myTcpClient.connect(getIpAddressSharedPrefs,
                                    portNum);
                            // here is where I want to call Async to do login
                            // or do whatever else.

                            UploadTask task = new UploadTask();
                            task.execute();


                        } catch (Exception e) {
                            Toast.makeText(getApplicationContext(),
                                    "Could not connect.", Toast.LENGTH_LONG)
                                    .show();
                            e.printStackTrace();
                        }
                    }

                }
            }
        });
    }

    private class UploadTask extends AsyncTask<String, Integer, Void> 
    {
        @Override
        protected void onPreExecute() {
            Toast.makeText(getApplicationContext(), "Loading...",
                    Toast.LENGTH_LONG).show();
                            }

        @Override
        protected Void doInBackground(String... names) {

                    resultCheck = myTcpClient.connect(getIpAddressSharedPrefs,
                            portNum);


                    if (resultCheck == true) {
                        while (myTcpClient.getUserNum() < 0) {
                            // num set? session? with proxy server?
                        }

                        String[] firstAndLast;

                        String spcDelmt = " ";

                        firstAndLast = userText.toString().split(spcDelmt);

                        fName = firstAndLast[0];
                        lName = firstAndLast[1];

                        // set up the tcp client to sent the information to the
                        // server.
                        client.login(fName, lName, encryptPassLoginActivity,regionSelected, 128, 128, 20);

                    } else {
                        Toast.makeText(getApplicationContext(),
                                "Connection not successful", Toast.LENGTH_LONG)
                                .show();
                    }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            Toast.makeText(getApplicationContext(), "Connected",
                    Toast.LENGTH_LONG).show();
        }
    }

}
4

2 に答える 2

1

初め

@Override
protected Void doInBackground(String...params) {
    new Thread (new Runnable() {
       // ...
    }
}

二度とこれをしないでください。実際にバックグラウンドThreadで実行されるdoInBackgroundメソッドを新しく作成する必要はありません。だからそれを削除します。 Thread

Threadsについて読む必要があるため、あなたへのアドバイスは注意が必要です。基本的なアプリケーションの例を読んだり、参考文献をConnection読んだりすることをお勧めします。tutorialsしたがって、ここから開始できます。

Android TCP Client and Server Communication Programming–Illustrated with Example

于 2012-07-09T19:13:57.070 に答える
0

どこでタスクを実行しているのかわかりませんが、内部で何かおかしなことをしていることがわかりますdoInBackground()! その中に独自のスレッドを作成する理由はまったくありません。それを削除すると、次のように Task を使用できます。

UploadTask task = new UploadTask();
task.execute("someString", "anotherString", "addAsManyStringsYouNeed");

AsyncTaskのドキュメントも非常に役立ちます。

于 2012-07-09T19:17:47.197 に答える