2013-03-28 79 views
0

我正在處理應用程序,在該應用程序中需要顯示進度欄的進度對話框,直到數據完全從網站下載爲止。 但是,當我運行我的代碼時,它顯示進度對話框,當整個數據已經完全從網站下載,並在加載時顯示我在模擬器上的黑屏。加載數據時未顯示進度對話框

所以我想顯示下載過程,如果用戶的互聯網連接速度慢。

請大家幫忙。

package com.androidhive.xmlparsing; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 

import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

public class AndroidXMLParsingActivity extends ListActivity { 


TextView textView; 
ArrayList<HashMap<String, String>> menuItems; 
// All static variables 
static final String URL = "http://feeds.bbci.co.uk/news/rss.xml" ; 
// XML node keys 
static final String KEY_ITEM = "item"; // parent node 
static final String KEY_ID = "id"; 
static final String KEY_NAME = "title"; 
//static final String KEY_COST = "cost"; 
static final String KEY_DESC = "description"; 
static final String KEY_IMAGE = "media:thumbnail"; 



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

    new HeavyWorker(AndroidXMLParsingActivity.this).execute(); 

    menuItems = new ArrayList<HashMap<String, String>>(); 

    XMLParser parser = new XMLParser(); 
    String xml = parser.getXmlFromUrl(URL); // getting XML 
    Document doc = parser.getDomElement(xml); // getting DOM element 

    NodeList nl = doc.getElementsByTagName(KEY_ITEM); 
    // looping through all item nodes <item> 
    for (int i = 0; i < nl.getLength(); i++) { 
     // creating new HashMap 
     HashMap<String, String> map = new HashMap<String, String>(); 
     Element e = (Element) nl.item(i); 
     // adding each child node to HashMap key => value 
     map.put(KEY_ID, parser.getValue(e, KEY_ID)); 
     map.put(KEY_NAME, parser.getValue(e, KEY_NAME)); 
    // map.put(KEY_COST, "Rs" + parser.getValue(e, KEY_COST)); 
     map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 
     map.put(KEY_IMAGE, parser.getValue(e, KEY_IMAGE)); 

     // adding HashList to ArrayList 
     menuItems.add(map); 
    } 




    // Adding menuItems to ListView 
    ListAdapter adapter = new SimpleAdapter(this, menuItems, 
      R.layout.list_item, 
      new String[] { KEY_NAME, KEY_DESC, KEY_IMAGE}, new int[] { 
        R.id.name, R.id.desciption, R.id.image }); 

    setListAdapter(adapter); 



    // selecting single ListView item 
    ListView lv = getListView(); 

    lv.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      // getting values from selected ListItem 
      String name = ((TextView) view.findViewById(R.id.name)).getText().toString(); 
     // String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString(); 
      String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString(); 


      // Starting new intent 
      Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class); 
      in.putExtra(KEY_NAME, name); 
      //in.putExtra(KEY_COST, cost); 
      in.putExtra(KEY_DESC, description); 
      startActivity(in); 

     } 
    }); 

/*  } 
    }).start(); 

    */  
     } 

public class HeavyWorker extends AsyncTask < Void , Integer , Object > { 



    ProgressBar progressBar = (ProgressBar)findViewById(R.id.progress); 

    int progress_status; 

    private ProgressDialog  progressDialog ; 
    private Context    targetCtx ; 

    public HeavyWorker (Context context) { 
     this.targetCtx = context ; 
     // this.needToShow = true; 
     progressDialog = new ProgressDialog (targetCtx) ; 
     progressDialog.setCancelable (false) ; 
     progressDialog.setMessage ("Retrieving data...") ; 
     progressDialog.setTitle ("Please wait") ; 
     progressDialog.setIndeterminate (true) ; 
    }  






    @Override 
    protected void onPostExecute(Object result) { 
     if(progressDialog != null && progressDialog.isShowing()){ 
      progressDialog.dismiss () ; 
     } 
    } 
    @Override 
    protected Object doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
      while (progress_status<100) 
      { 

       progress_status+=2; 
       setProgress(progress_status); 
       try { 
        Thread.sleep(300); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
       } 
      } 

     return null; 
    } 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
     progressBar.setProgress(values[0]); 
      textView.setText("downloading " +values[0]+"%"); 


    } 






    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     progressDialog.show () ; 
     super.onPreExecute(); 
    } 



} 

} 

回答

0

ProgressDialog之前,請嘗試以下方法:

@Override 
    protected void onPreExecute() { 
     progressDialog.show() ; 
    } 

我有一個類似的問題,我改成了上述問題解決了。

+0

沒有這不解決我的問題........我的對話框繼續顯示當我的數據加載 – dev 2013-03-28 10:12:23

+0

好吧我想你應該做的所有下載在背景..然後它應該工作正常... – 2013-03-28 10:16:03

+0

我看到了你的代碼,我認爲XML解析是繁重的工作,不是嗎?你不能將它移動到背景嗎? – 2013-03-28 10:18:49

-1
progressDialog.create(); 
progressDialog.show(); 

這行,你忘了,它寫下來,下面的

progressDialog.setTitle ("Please wait") ; 
progressDialog.setIndeterminate (true) ; 
+0

Hellooo ...這是什麼解決方案?來吧。如果你得到Solutin分享它。 :( – 2013-03-28 13:19:52

0

輸入上onPreExecute方法

if (!progressDialog.isShowing()){ 
    progressDialog = ProgressDialog.show(AbstractActivity.this, "",getString(R.string.please_wait), false); 
} 

的代碼onPostExecute

if (progressDialog.isShowing()) 
     progressDialog.dismiss(); 
輸入驗證碼

您試圖表明super.onPreExecute();

嘗試後super.onPreExecute();

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    progressDialog.show () ; 
}