2012-05-03 7 views
0

ボタンを押すと、ウェブページからデータを取得し、レイアウトに従って表示するはずです。これはうまくいきますが、戻るをクリックするだけで、私の主なアクティビティ(ホームアクティビティ)に戻り、もう一度ボタンを押します。Android:ウェブサイトからXML情報を取得する際の読み込み時間を短縮するにはどうすればよいですか?

初めてボタンを押したときに読み込まれるまでに時間がかかり、時には機能しないことがあります。しかし、2回目は即座に負荷がかかる[うまくいく]。

ここではコードです - 3つのクラス - HomeActivity.java、News.JavaとMyNewsHandler.java

public class HomeActivity extends Activity 
{ 
String username = " "; 
Button alog; 
Button news; 
Button forumTime; 
EditText usernameEntry; 
SharedPreferences preferences; 
ImageView image; 
TextView usernametv; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.home); 

    forumTime = (Button)findViewById(R.id.timeButton); 
    news = (Button) findViewById(R.id.newsButton); // <--- Heres the problem 
    alog = (Button) findViewById(R.id.alogButton); 
    usernameEntry = (EditText) findViewById(R.id.username); 


    //For news button 
    OnClickListener newsListener = new OnClickListener() 
    { 
     public void onClick(View v) 
     { 
      Intent intent = new Intent(HomeActivity.this, News.class); 
      startActivity(intent); 
     } 
    }; 

    //Attaching listeners 
    //forumTime.setOnClickListener(timeListener); 
    //alog.setOnClickListener(alogListener); 
    news.setOnClickListener(newsListener); 
} 

public void display(String string) 
{ 
    Toast.makeText(getBaseContext(), string, 300000).show(); 
} 

}

public class MyNewsHandler extends DefaultHandler 
{ 
private Boolean inTitle = false; 
private Boolean inDescription = false; 
private Boolean inItem = false; 
private Boolean inCategory = false; 
static public ArrayList<String> title = new ArrayList<String>(), 
    description = new ArrayList<String>(), category = new ArrayList<String>(); 
private StringBuilder buff = null; 
// All methods auto called in this order - start, characters, end 
/* 
* Called when an xml tag starts 
* imgView.setImageResource(R.drawable.newImage); 
*/ 
@Override 
public void startElement(String uri, String localName, String qName,Attributes attributes) 
{ 
    if (inItem) 
    { 
     if (localName.equals("title")) 
     { 
      inTitle = true; 
      buff = new StringBuilder(); 
     } 
     if (localName.equals("description")) 
     { 
      inDescription = true; 
      buff = new StringBuilder(); 
     } 
     if (localName.equals("category")) 
     { 
      inCategory = true; 
      buff = new StringBuilder(); 
     } 

    } 
    if (localName.equals("item")) 
    { 
     inItem = true; 
    } 
} 
/* 
* Called when an xml tag ends 
*/ 
@Override 
public void endElement(String uri, String localName, String qName)throws SAXException 
{ 
    if (!inTitle && !inDescription && !inCategory) 
    { 
     inItem = false; 
    } 
    else 
    { 
     if (inTitle) 
     { 
      String check = buff.toString().trim(); 
      title.add(check); 
      inTitle = false; 
      buff = null; 
     } 
     if (inDescription) 
     { 
      String check2 = buff.toString().trim(); 
      String array []; 
      int index = 0; 
      if (check2.contains("/>")) 
      { 
       array = check2.split("/>"); 
       index = check2.indexOf("10;"); 
       description.add(array[array.length - 1].trim()); 
      } 

      else description.add(check2); 
      //description.add(array[1]); 
      inDescription = false; 
      buff = null; 
     } 
     if(inCategory) 
     { 
      String check = buff.toString().trim(); 
      category.add(check); 
      inCategory = false; 
      buff = null; 
     } 
    } 
} 
/* 
* Called to get tag characters 
*/ 
@Override 
public void characters(char ch[], int start, int length) 
{ 
    if (buff != null) 
    { 
     for (int i = start; i < start + length; i++) 
     { 
      buff.append(ch[i]); 
     } 
    } 
} 

}

public class News extends ListActivity 
{ 
String url; 
TextView text1; 
TextView text2; 
static ImageView img; 
// newsList contains the list items 
static ArrayList<HashMap<String, Object>> newsList = new ArrayList<HashMap<String, Object>>(); 
// to store drawable id's 
static HashMap<String, Integer> images = new HashMap<String, Integer>(); 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    //Load xml containing image view and a linear layout with 2 textviews 
    setContentView(R.layout.aloglistview); 

    img = (ImageView)findViewById(R.id.imageView2); 
    text1 = (TextView) findViewById(R.id.text1); 
    text2 = (TextView) findViewById(R.id.text2); 

    // url we are retrieving from 
    url = "http://services.runescape.com/m=news/latest_news.rss"; 

    HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet(url); 
    String result = ""; // result of http Post 
    try 
    { 
     // Execute HTTP get Request 
     HttpResponse response = httpclient.execute(httpget); 

     // Extract the page content returned from the response 
     BufferedReader in = new BufferedReader(new InputStreamReader(
       response.getEntity().getContent())); 
     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 
     while ((line = in.readLine()) != null) 
     { 
      sb.append(line + NL); 
     } 
     in.close(); 
     result = sb.toString(); // resulting content of the page 
    } catch (ClientProtocolException e) 
    { 
     Log.d("ERROR", "ClientProtocolException=" + e); 
     System.err.println("ClientProtocolException=" + e); 
    } catch (IOException e) 
    { 
     Log.d("ERROR", "IOException=" + e); 
     System.err.println("IOException=" + e); 
    } 
    try 
    { 
     //Parse the resulting page 
     Xml.parse(result, new MyNewsHandler()); 
    } catch (SAXException e) 
    { 
     e.printStackTrace(); 
    } catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
    //needs to match formulate list thing 
    SimpleAdapter adapter = new SimpleAdapter(this, newsList, 
      R.layout.newsitem, new String[] { "Title", "Description", "Image"}, 
      new int[] { R.id.textnews1, R.id.textnews2, R.id.imageView2}); 

    populateList(); //Add all items to the newslist 
    setListAdapter(adapter); 
} 
public void populateList() 
{ 
    //Method to add to images hashmap 
    initMap(); 
    //reset each time the list is populated 
    newsList = new ArrayList<HashMap<String, Object>>(); 
    //Display 10 items 
    for (int i = 0; i < 11; i++) 
    { 
     HashMap<String, Object> temp = new HashMap<String, Object>(); 
     String title = MyNewsHandler.title.get(i); 
     String category = MyNewsHandler.category.get(i); 
     //default drawable 
     int drawable = R.drawable.item; 
     //Match title text to hash keys to set correct image 
     for (Map.Entry<String, Integer> entry : images.entrySet()) 
     { 
      String key = entry.getKey(); 
      Object value = entry.getValue(); 
      if(category.contains(entry.getKey())) 
      { 
       drawable = entry.getValue(); 
       break; 
      } 
      else drawable = R.drawable.item; 
     } 
     temp.put("Title", title); 
     temp.put("Description", " " + MyNewsHandler.description.get(i)); 
     temp.put("Image",drawable); 
     newsList.add(temp); 
    } 
} 
public void display(String string) 
{ 
    Toast.makeText(getBaseContext(), string, 1000202).show(); 
} 
public void initMap() 
{ 
    images.put("Behind the Scenes News",R.drawable.behindthescenes); 
    images.put("Customer Support News",R.drawable.customerservice); 
    images.put("Game Update News",R.drawable.gameupdate); 
    images.put("Website News",R.drawable.devblog); 
    images.put("Technical News",R.drawable.technicalnews); 
} 

}

は、申し訳ありません、コードはとてもです問題はそれが働いていることです(ha ..)。しかし、初めて欲しいときにはすぐには読み込まれません。それは、これがない

:アプリを起動し >はニュース]ボタン>「doesntの負荷、空白の画面」

を打つが、私はこれを行うとき、それが動作します:ニュースのボタンを押してアプリを起動 >ニュース]ボタンを打つ>>反撃> "即座に読み込み"

私はボタンを押す前にあらかじめ解析した提案に従いました。また、私が画像を完全に取り除いた別の試みもありました。変わりはない。それでも同じ振る舞い。

ご迷惑をおかけして申し訳ございません。

+0

問題は手順2にあると思います。ニュースアクティビティが読み込まれるたびにウェブサイトにヒットしますか?別のスレッドでHTTP接続を行っていますか?レスポンスの接続と取得のコードを表示できますか? –

+0

コードを見なくても何が問題になるか話しがたいです...標準的なものだと思っていますが、あなたの説明に明らかな誤りはないので、あなたが実際に何をしているのか有用なアドバイスを提供しています。 –

+0

あなたのためのコードに追加されました。 – ryvianstyron

答えて

1

ツリーポイント:

  1. 使用AsyncTask直接UI
  2. キャッシュのすべてに関連していないもののために。 WebサイトからXMLを入手したら、ファイルをどこかに保存し、次回ダウンロードを開始する前にファイルから読み込みます。
  3. 予圧。ユーザーがボタンをクリックするのを待ってはいけません。アプリケーションが起動するとすぐに、AsyncTask(p.1を参照)を起動して、バックグラウンドダウンロードとXML解析を実行します。ユーザーがボタンを押すまでに、結果が準備されます。
+0

こんにちは私はhteユーザーがボタンを押す前に、XMLをプリロードしようとしました。しかし、その行動は変わらなかった。 – ryvianstyron

+0

DNS設定、最初の要求タイムアウトに問題があるか、データをダウンロードしようとしているサーバーの場所に関するデータがないため、時間がかかります。 2回目は既にキャッシュに入っているので、ほぼ即座に動作します。 XMLリクエストでドメイン名の代わりに数値アドレス(123.234.123.234)を使用して、何が起こるかを確認することがあります。 – lenik

+0

申し訳ありませんが、これを受け入れるにはとても時間がかかりました... !!私は以前この仕事の年齢を得ました! – ryvianstyron

1

すべてのlenikは言った。

私の解決策はわずかに異なりました。 (ボタンを押すか、他のトリガイベント)で

  1. (代わりに、AsyncTaskの)IntentServiceオフ キックその意図を発行します。私はこのような何かをしました。どうして?その構文 は簡単で、いくつかの場所から呼び出す必要があります。
  2. すぐに結果が表示され始め、 トリクルインの結果が表示されます。これは、 ContentProviderを通じてすべてのデータを公開して、ListFragmentをオフにする簡単な方法です。
+0

皆さん、ありがとうございました。私は誰もが怒っているほとんどすべてを試しましたが、私はいつもどこかでつかまってしまいます。私はこの素晴らしいサイトを今日発見しました - > http://www.ibm.com/developerworks/xml/tutorials/x-androidrss/そして、実際に問題を解決しました。私が今やらなければならないことは、実際のListView ... – ryvianstyron

関連する問題