1

学校のウェブサイトから情報を取得するためのログイン ページを作成しようとしています (スケジュール情報など)。コードはJavaドライバーとして完全に機能しますが、Androidで動作するようにしようとしています。AsyncTask型紙を使えばいいと友達に言われました。誰かがAsyncTask以下のコードで を使用する方法を教えてもらえますか?

public class MainActivity extends Activity implements OnClickListener {
    EditText un,pw;
    TextView error;
    Button ok;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        un=(EditText)findViewById(R.id.et_un);
        pw=(EditText)findViewById(R.id.et_pw);

        ok=(Button)findViewById(R.id.btn_login);
        ok.setOnClickListener(this); 
    }

    public void postLoginData() {
        //Create a new HttpClient and Post Header
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost=new HttpPost("url");

        try {
            EditText un=(EditText)findViewById(R.id.et_un);
            String username=un.getText().toString();

            EditText pw=(EditText)findViewById(R.id.et_pw);
            String password=un.getText().toString();

            MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

            entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
            entity.addPart("userName", new StringBody("username"));
            entity.addPart("password", new StringBody("password"));
            entity.addPart("btnLogin", new StringBody("Login"));
            entity.addPart("__EVENTTARGET", new StringBody(""));

            //Post to login site
            httppost = new HttpPost("https://my.jcsu.edu/ICS");
            httppost.setEntity(entity);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity response_entity = response.getEntity();
            if (response_entity != null) {
                Jsoup.parse(EntityUtils.toString(response_entity));
            }

            HttpGet httpget = new HttpGet("url");
            response = httpclient.execute(httpget);
            response_entity = response.getEntity();


            if (response_entity != null) {
                Document doc = Jsoup.parse(EntityUtils.toString(response_entity));

                // Get the user's name
                Element userWelcome = doc.getElementById("userWelcome");
                System.out.println("Welcome " + userWelcome.getElementsByTag("strong").get(0).html());

                // Get the user's schedule
                System.out.println("\nCourse Schedule:");
                Elements gbody = doc.getElementsByClass("gbody");
                Element tr = gbody.get(4);
                Elements td = tr.getElementsByTag("td");
                for (Element e : td) {
                    if (e.html().contains("<ul>") || e.html().contains("<a"))
                        continue;
                    else

                        System.out.println(e.html());
                }

                // Get user's information
                System.out.println("\nAcademic Information:");
                System.out.println(doc.getElementById("pg7_V_rptPackage_ctl00_lblDivision").html()
                                   .replace("&nbsp;", ""));
                System.out.println("Faculty Advisors: "
                                   + doc.getElementById("pg7_V_rptPackage_ctl00_rptAdvisor_ctl00_lblAdvisorInfo").html() + ", "
                                   + doc.getElementById("pg7_V_rptPackage_ctl00_rptAdvisor_ctl02_lblAdvisorInfo").html());
                System.out.println("Intended Majors: "
                                   + doc.getElementById("pg7_V_rptPackage_ctl00_rptMajor_ctl00_lblMajorInfo").html());

            }
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void onClick(View view) {
        if(view == ok){
            postLoginData();
        }
    }

}
4

1 に答える 1

1

メソッドOnClickListener.onClickは UI スレッドから呼び出されるため、そのメソッドから長時間実行される操作を行うべきではありません。内部から、ネットワーク リクエストを行うonClickを呼び出します。postLoginDataUI スレッドからそれを行うべきではありません。

何かが欠けていない限り、実際には上記を使用する理由がわかりません。AsyncTask単に newThreadを使用してバックグラウンド作業を行うことができます。これは、メソッドがpostLoginData単にリクエストを作成し、いくつかのものを に出力するためSystem.outです。

public void postLoginData() {
    new Thread() {
        // ... body of postLoginData()
    }.start();
}

ただし、実際には、スニペットの一部ではないコード、または後で追加するコードがいくつかあると思います。ネットワーク操作の完了後にそのコードが UI を更新する場合は、AsyncTask. 私はそれを使用して例をスケッチしようとします。

UI スレッドから UI を更新する必要がありますが、UI スレッドでネットワーク リクエストなどの長時間実行される操作を実行することはできません。Android の背後にある基本的な考え方AsyncTaskは、UI スレッドとバックグラウンド スレッドの両方で作業をスケジュールすることです。これにより、データのダウンロードを開始し、ダウンロード中に進行状況バーを更新し、完了時に UI を更新できます。postLoginDataを使用して実装する方法の基本的なスケッチを次に示しますAsyncTask

PostLoginDataTask extends AsyncTask {
    String username, password;

    onPreExecute() { // runs on the UI thread
        EditText un=(EditText)findViewById(R.id.et_un);
        username=un.getText().toString();

        EditText pw=(EditText)findViewById(R.id.et_pw);
        password=un.getText().toString();
    }

    doInBackground() { // runs on a background thread
        //Create a new HttpClient and Post Header
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost=new HttpPost("url");

        MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);

        entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
        entity.addPart("userName", new StringBody("username"));
        entity.addPart("password", new StringBody("password"));
        entity.addPart("btnLogin", new StringBody("Login"));
        entity.addPart("__EVENTTARGET", new StringBody(""));

        //Post to login site
        httppost = new HttpPost("https://my.jcsu.edu/ICS");
        httppost.setEntity(entity);
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity response_entity = response.getEntity();
        if (response_entity != null) {
            Jsoup.parse(EntityUtils.toString(response_entity));
        }

        HttpGet httpget = new HttpGet("url");
        response = httpclient.execute(httpget);
        response_entity = response.getEntity();

        return response_entity;
    }

    onPostExecute() { // runs on the UI thread
        if (response_entity != null) {
            Document doc = Jsoup.parse(EntityUtils.toString(response_entity));

            // Get the user's name
            Element userWelcome = doc.getElementById("userWelcome");
            System.out.println("Welcome " + userWelcome.getElementsByTag("strong").get(0).html());

            // Get the user's schedule
            System.out.println("\nCourse Schedule:");
            Elements gbody = doc.getElementsByClass("gbody");
            Element tr = gbody.get(4);
            Elements td = tr.getElementsByTag("td");
            for (Element e : td) {
                if (e.html().contains("<ul>") || e.html().contains("<a"))
                    continue;
                else

                    System.out.println(e.html());
            }

            // Get user's information
            System.out.println("\nAcademic Information:");
            System.out.println(doc.getElementById("pg7_V_rptPackage_ctl00_lblDivision").html()
                               .replace("&nbsp;", ""));
            System.out.println("Faculty Advisors: "
                               + doc.getElementById("pg7_V_rptPackage_ctl00_rptAdvisor_ctl00_lblAdvisorInfo").html() + ", "
                               + doc.getElementById("pg7_V_rptPackage_ctl00_rptAdvisor_ctl02_lblAdvisorInfo").html());
            System.out.println("Intended Majors: "
                               + doc.getElementById("pg7_V_rptPackage_ctl00_rptMajor_ctl00_lblMajorInfo").html());

            // Any updates to the UI should go in this method
        }
    }
}

これは完全に正しいわけではなく、コンパイルできないことに注意してください。ジェネリック型パラメーター Params、Progress、および Result を調べて、それをコードに適合させる方法を理解する必要があります。読者のための演習として残しておきます:P それほど難しくはありませんが、混乱している場合は、コメントでお気軽に質問してください...

それが役立つことを願っています!

于 2012-09-23T22:25:28.280 に答える