0

次の Android コードを使用して、インターネット上の HTML ページに接続し、数行を抽出します。ほとんどの場合、コードは正常に実行されますが、ハングすることがあります。「強制終了」ダイアログを表示するには、モバイルの戻るボタンを押す必要があります。ただし、エミュレーターでは常に正常に動作します (PC で高速接続を使用します)。

  1. 携帯電話の EDGE/GPRS 接続が遅いためにコードがハングしているのでしょうか?
  2. ソケットのタイムアウトを挿入する必要がありますか?
  3. コードがハングする他の理由は何ですか?
  4. コードがハングしないようにするにはどうすればよいですか? エラーをトラップして、再試行する前にユーザーにメッセージを返す方法はありますか?

助けてください。

   private String readFile(){
    List<String> scores = new ArrayList<String>();
    String result="";
    String score = "";
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet("http://www.espncricinfo.com/icc_cricket_worldcup2011/engine/current/match/433567.html");
    try{
        HttpResponse response = client.execute(request);
        //txtResult.setText(HttpHelper.request(response));

        try{
            InputStream in = response.getEntity().getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder str = new StringBuilder();
            String line = null;
            while((line = reader.readLine()) != null){
                str.append(line + "\n");
            }
            in.close();

            result = str.toString();
            //result = str.toString().substring(1,500);

            Pattern p = Pattern.compile(
                    "<title>(.*)</title>",
                     Pattern.DOTALL
                );
            Matcher matcher = p.matcher(
                     result
                );

            if (matcher.find())
            {
                score = matcher.group(1).toString();
            }

             TextView tv = (TextView)findViewById(R.id.textview);
             tv.setText(score);

            return score;

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Toast.makeText(this, "IOException e  = " + e.toString(), Toast.LENGTH_LONG).show();
            Log.d(TAG, "IOException e  = " + e.toString());

            return "IOException e  = " + e.toString();
         }catch(Exception ex){
            result = "Error";
            ex.printStackTrace();
            Toast.makeText(this, "Exception ex  = " + ex.toString(), Toast.LENGTH_LONG).show();
            Log.d(TAG,"Exception ex  = " + ex.toString());
            return "Exception ex  = " + ex.toString();
        }
    } catch (SocketTimeoutException e) {
        e.printStackTrace();
        Toast.makeText(this, "SocketTimeoutException e  = " + e.toString(), Toast.LENGTH_LONG).show();
        Log.d(TAG, "SocketTimeoutException e  = " + e.toString());
        return "SocketTimeoutException e  = " + e.toString();
    }catch(Exception ex){
        Toast.makeText(this, "Exception ex1  = " + ex.toString(), Toast.LENGTH_LONG).show();
          Log.d(TAG, "Exception ex1  = " + ex.toString());
          return  "Exception ex1  = " + ex.toString();
    }
}
4

1 に答える 1

0

これをアプリケーションのメインスレッドで実行していますか?実行時間の長いプロセスは、ユーザーのメインスレッドの速度が低下しないように、別のスレッドで実行する必要があります。

たとえば、Androidデベロッパーガイドをご覧ください。

于 2011-02-26T14:18:20.980 に答える