2013-03-28 79 views
1

問題是,如果用戶的網絡連接速度較慢,那麼我想在從網站加載數據時顯示進度對話框。 我使用AsyncTask類來實現這一點。 但是,當我運行我的代碼時,我的對話框顯示在數據已經加載在屏幕上的時間。 和加載期間,我看到模擬器上的黑屏。 請給出建議如何在加載開始時顯示進度對話框,並在加載結束時自動關閉。我不想在開始時看到黑屏。 這是我的主要java文件。 請幫忙..................在android中管理進度對話框的顯示時間

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(); 

System.out.println("you are on print line 1"); 
    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 
    System.out.println("you are on print line 2"); 
    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); 
    } 

    System.out.println("you are on print line 3"); 


    // 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) ; 
     System.out.println("you are on print line 5"); 
    } 







    @Override 
    protected void onPostExecute(Object result) { 
     if(progressDialog != null && progressDialog.isShowing()){ 
       progressDialog.dismiss () ; 
      } 
     System.out.println("you are on print line 6"); 
    } 
    @Override 
    protected Object doInBackground(Void... params) { 
     // TODO Auto-generated method stub 
     while (progress_status<100) 
      { 
       progress_status+=2; 
       setProgress(progress_status); 
       try { 
        Thread.sleep(3000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
       } 
      } 
     System.out.println("you are on print line 7"); 

     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]+"%"); 
      System.out.println("you are on print line 8"); 

    } 







    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     progressDialog.show () ; 
     super.onPreExecute(); 
     System.out.println("you are on print line 9"); 
    } 


} 


} 

回答

0

你得奶源後臺線程當加載大型數據表格服務器。看我會盡力解釋你。

See Here例如鏈接

調用線程開始前1級完整的任務。

@Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 

     super.onPreExecute(); 
// This will call before the loading the URL data. so if you want to get data from locally that logic should be written here. 
    } 

} 

呼叫2在後臺負載數據thered @覆蓋 保護對象doInBackground(空隙... PARAMS){// TODO自動生成方法存根

while (progress_status<100) 
     { 
      progress_status+=2; 
      setProgress(progress_status); 
      try { 
       Thread.sleep(3000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
      } 
     } 
    System.out.println("you are on print line 7"); 

    return null; 
} 

呼叫3這是UI線程,將根據重試數據更新UI。

@Override 
    protected void onProgressUpdate(Integer... values) { 
     // TODO Auto-generated method stub 

// show your dialog here progressDialog.show () ; 

     super.onProgressUpdate(values); 
     progressBar.setProgress(values[0]); 
      textView.setText("downloading " +values[0]+"%"); 
      System.out.println("you are on print line 8"); 

    } 

調用線程的4月底。所以顯示最終輸出或釋放控制。

@Override 
    protected void onPostExecute(Object result) { 

     if(progressDialog != null && progressDialog.isShowing()){ 
       progressDialog.dismiss () ; 
      } 
     System.out.println("you are on print line 6"); 
    }