2

AndroidでログインするためのYouTubeガイドに従っていました。私はこれまでに到達しましたが、YouTube ガイドは以前の SDK に依存して機能していると思います。ICS 以降のバージョンでは、Async を使用する必要があることを読みました (NetworkOnMainThreadException を取得していました)。私はこれを実装する方法を理解しようとして2日間働いてきました。

これは、アプリが動作を停止するまで Loading ターミナルで停止します。RunInBackground() の内部が多すぎるためですか?

適切な時間内にメソッドを機能させるにはどうすればよいでしょうか。

これについて誰か助けていただければ幸いです。ところで、私は非同期タスクを実装するように言っている多くのドキュメントを読みましたが、私の質問はこれをどのように行うのでしょうか?

**バックエンド: アプリは情報を wamp サーバー上の index.php に送信し、次に php がデータベースと通信します。

package com.sokies.my_team;

public class MainActivity extends Activity implements OnClickListener {

    EditText etUser, etPass;
    Button bLogin;

    //Create string variables that will have the input assigned to them
    String username, password;

    //Create a HTTPClient as the form container
    HttpClient httpclient;

    //Use HTTP POST method
    HttpPost httppost;

    //Create an array list for the input data to be sent
    ArrayList<NameValuePair> nameValuePairs;

    //Create a HTTP Response and HTTP Entity
    HttpResponse response;
    HttpEntity entity;


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initialise();

    }



    private void initialise() {
        etUser = (EditText) findViewById(R.id.etUser);
        etPass = (EditText) findViewById(R.id.etPass);
        bLogin = (Button) findViewById(R.id.bSubmit);
        //Now to set an onClickListener
        bLogin.setOnClickListener(this);
    }

    public void onClick(View v)  {
        // This is where we will be working now

        new MyAsyncTask().execute();

    }//END onClick()

    private static String convertStreamToString(InputStream is) {
        /*
         * To convert the InputStream to String we use the BufferedReader.readLine()
         * method. We iterate until the BufferedReader return null which means
         * there's no more data to read. Each line will appended to a StringBuilder
         * and returned as String.
         */
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return sb.toString();
    }//END convertStreamToString()



    private class MyAsyncTask extends AsyncTask<Void, Void, Void>
{
        ProgressDialog mProgressDialog;
        @Override
        protected void onPostExecute(Void result) {
            mProgressDialog.dismiss();
        }

        @Override
        protected void onPreExecute() {
            mProgressDialog = ProgressDialog.show(MainActivity.this, "Loading...", "Data is Loading...");
        }

        @Override
        protected Void doInBackground(Void... params) {

            //Create new default HTTPClient
            httpclient = new DefaultHttpClient();

            //Create new HTTP POST with URL to php file as parameter
            httppost = new HttpPost("http://10.0.2.2/myteamapp/index.php"); 

            //Assign input text to strings
            username = etUser.getText().toString();
            password = etPass.getText().toString();



            //Next block of code needs to be surrounded by try/catch block for it to work
            try {
                //Create new Array List
                nameValuePairs = new ArrayList<NameValuePair>(2);

                //place them in an array list
                nameValuePairs.add(new BasicNameValuePair("user", "username"));
                nameValuePairs.add(new BasicNameValuePair("pass", "password"));

                //Add array list to http post
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));


                //assign executed form container to response
                response = httpclient.execute(httppost); //response from the PHP file

                //check status code, need to check status code 200
                if(response.getStatusLine().getStatusCode() == 200){

                    //assign response entity to http entity
                    entity = response.getEntity();

                    //check if entity is not null
                    if(entity != null){


                        //Create new input stream with received data assigned
                        InputStream instream = entity.getContent();

                        //Create new JSON Object. assign converted data as parameter.
                        JSONObject jsonResponse = new JSONObject(convertStreamToString(instream));

                        //assign json responses to local strings
                        String retUser = jsonResponse.getString("user");//mySQL table field
                        String retPass = jsonResponse.getString("pass");

                        //Validate login
                        if(username.equals(retUser)&& password.equals(retPass)){ //Check whether 'retUser' and 'retPass' matches username/password 

                            //Display a Toast saying login was a success
                            Toast.makeText(getBaseContext(), "Successful", Toast.LENGTH_SHORT).show();


                        } else {
                            //Display a Toast saying it failed.

                            Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();
                        }

                    }


                }


            } catch(Exception e){

               // e.printStackTrace();
                //Display toast when there is a connection error
                //Change message to something more friendly
               Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_SHORT).show();
               Toast.makeText(getBaseContext(), "Connection Error", Toast.LENGTH_SHORT).show();

               return null;
            }



            return null;
        }
    }
}
4

1 に答える 1

2

ToastAndroidでは禁止されているバックグラウンドスレッドからUI(あなたの場合は表示されています)で操作を実行しようとしています。methodで値 (fe、成功の場合は 1、失敗の場合は 0) を返して、UI スレッドで呼び出される でdoInBackground処理するようにしてください。onPostExecute

つまり、バックグラウンド タスクの実行前後に、常にメイン スレッドのユーザー インターフェイスで操作を実行しますonPreExecuteonPostExecute

于 2012-11-04T23:33:21.507 に答える