2013-04-16 40 views
1

我试图做一个“载入中...”的消息出现,而用户反应如何显示“加载...”消息正在等待效应初探从Web服务出现。在等待来自Web服务

我看了一下其他各种类似的问题/答案和教程我在网上找到,但不能完全得到它正常工作。

任何帮助将非常感激!

代码是在这里:

public class SunriseSunset extends Activity implements OnClickListener { 

    public Button getLocation; 
    public Button setLocationJapan; 
    public TextView LongCoord; 
    public TextView LatCoord; 
    public double longitude; 
    public double latitude; 
    public LocationManager lm; 
    public Spinner Locationspinner; 
    public DateDialogFragment frag; 
    public Button date; 
    public Calendar now; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sunrisesunset); 
     // Show the Up button in the action bar. 
       setupActionBar(); 

     //Setting onClickListener for Calculate Sunrise/Sunset Button 
     findViewById(R.id.CalculateSunriseSunset).setOnClickListener(this); 

     //Sets up LocationManager to enable GPS data to be accessed. 
     lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, 
       new MyLocationListener()); 

     //Declares Latitude and Longitude TextViews 
     LatCoord = (TextView) findViewById(R.id.LatCoord); 
     LongCoord = (TextView) findViewById(R.id.LongCoord); 

     //Declares for Location Spinner/Dropdown 
     addListenerOnSpinnerItemSelection(); 

     //Date shit 
     now = Calendar.getInstance(); 
     date = (Button)findViewById(R.id.date_button); 
     date.setText(DateFormat.format("dd MMMM yyyy", Calendar.getInstance())); 
     date.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       showDialog(); 
      } 
     }); 

    } 
    /** 
    * Set up the {@link android.app.ActionBar}. 
    */ 
    private void setupActionBar() { 

     getActionBar().setDisplayHomeAsUpEnabled(true); 

    } 

    // More date shit 
    @SuppressLint("CommitTransaction") 
    public void showDialog() { 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); //get the fragment 
     frag = DateDialogFragment.newInstance(this, new DateDialogFragmentListener(){  

     public void updateChangedDate(int year, int month, int day){      
     now.set(year, month, day); 
     date.setText(DateFormat.format("dd MMMM yyyy", now));    
     } 
      }, now); 
     frag.show(ft, "DateDialogFragment");  } 



    public interface DateDialogFragmentListener{ 
     //this interface is a listener between the Date Dialog fragment and the activity to update the buttons date 
     public void updateChangedDate(int year, int month, int day); 
    } 

    public void addListenerOnSpinnerItemSelection() { 
     Locationspinner = (Spinner) findViewById(R.id.Locationspinner); 
     Locationspinner 
       .setOnItemSelectedListener(new CustomOnItemSelectedListener(
         this)); 
    } 


    protected void showCurrentLocation() { 
     // TODO Auto-generated method stub 
     // This is called to find current location based on GPS data and sends 
     // these values to the LongCoord and LatCoord TextViews 
     Location location = lm 
       .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     latitude = location.getLatitude(); 
     longitude = location.getLongitude(); 

     LongCoord.setText(Double.toString(longitude)); 
     LatCoord.setText(Double.toString(latitude)); 
    } 

    @Override 
    public void onClick(View arg0) { 
     Button b = (Button) findViewById(R.id.CalculateSunriseSunset); 
     b.setClickable(false); 
     new LongRunningGetIO().execute(); 
    } 

    public class LongRunningGetIO extends AsyncTask<Void, Void, String> { 
     //Reads in the web service 
     protected String getASCIIContentFromEntity(HttpEntity entity) 
       throws IllegalStateException, IOException { 
      InputStream in = entity.getContent(); 
      StringBuffer out = new StringBuffer(); 
      int n = 1; 
      while (n > 0) { 
       byte[] b = new byte[4096]; 
       n = in.read(b); 
       if (n > 0) 
        out.append(new String(b, 0, n)); 
      } 
      return out.toString(); 
     } 

     @SuppressLint("SimpleDateFormat") 
     @Override 
     protected String doInBackground(Void... params) { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpContext localContext = new BasicHttpContext(); 

      // Finds todays date and adds that into the URL in simple date format DD/MM 
      SimpleDateFormat df = new SimpleDateFormat("dd/MM"); 
      String formattedDate = df.format(now.getTime()); 

      String finalURL = "http://www.earthtools.org/sun/" 
        + LatCoord.getText().toString().trim() + "/" 
        + LongCoord.getText().toString().trim() + "/" 
        + formattedDate + "/99/0"; 
      HttpGet httpGet = new HttpGet(finalURL); 
      String text = null; 

      try { 
       HttpResponse response = httpClient.execute(httpGet, 
         localContext); 
       HttpEntity entity = response.getEntity(); 
       text = getASCIIContentFromEntity(entity); 
      } catch (Exception e) { 
       return e.getLocalizedMessage(); 
      } 
      return text; 
     } 

     protected void onPostExecute(String results) { 
      if (results != null) { 
       try { 

        DocumentBuilderFactory dbFactory = DocumentBuilderFactory 
          .newInstance(); 
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
        InputSource s = new InputSource(new StringReader(results)); 
        Document doc = dBuilder.parse(s); 
        doc.getDocumentElement().normalize(); 
        TextView tvSunrise = (TextView) findViewById(R.id.Sunrise); 
        TextView tvSunset = (TextView) findViewById(R.id.Sunset); 
        tvSunrise.setText(doc.getElementsByTagName("sunrise").item(0).getTextContent()); 
        tvSunset.setText(doc.getElementsByTagName("sunset").item(0).getTextContent()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      Button b = (Button) findViewById(R.id.CalculateSunriseSunset); 
      b.setClickable(true); 
     } 
    } 



    class MyLocationListener implements LocationListener { 
     @Override 
     public void onLocationChanged(Location location) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onProviderDisabled(String provider) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onProviderEnabled(String provider) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
      // TODO Auto-generated method stub 
     } 
    } 
} 

任何帮助将非常感激:) X

回答

3

阅读AsyncTask,如果您尚未阅读。

该类允许执行后台操作并在UI线程上发布结果 而无需操作线程和/或处理程序。

有,你可以在它里面很少使用的功能。例如: onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

在onPreExecute(),申报一个对话框,显示加载...使用此框:

private final ProgressDialog dialog = new ProgressDialog(YourClass.this); 

protected void onPreExecute() { 
    this.dialog.setMessage("loading..."); 
    this.dialog.show(); 
} 

然后在doInBackground,你可以做你的任务。即调用web服务并等待响应(这样您将在后台线程中等待而不锁定UI)。

protected Boolean doInBackground(final Void unused) { 
    // call your web service here and do other stuff(wait). 
    // return true when success else false 
} 

上述函数会返回一个被接受为onPostExecute OnpostExecute(参数)布尔值,停止该对话框并显示其他像成功等喜欢的东西:

protected void onPostExecute(final Boolean result) { 
    if (this.dialog.isShowing()) { // if dialog box showing = true 
     this.dialog.dismiss(); // dismiss it 
    } 
    if (result.booleanValue()) { 
     //also show register success dialog 
    } 
} 

还要检查this线程。希望这可以帮助。

+2

加[onProgressUpdate(http://developer.android.com/reference/android/os/AsyncTask.html#onProgressUpdate%28Progress...%29)如果你想有一个进度条,而不仅仅是一个静态的文本。 – Gustek

0

尝试显示进度对话框,而你执行你的AsyncTask和解雇后的对话框执行你的AsyncTask的。此外:

private ProgressDialog progressDialog; 

@Override 
    public void onClick(View arg0) { 
     Button b = (Button) findViewById(R.id.CalculateSunriseSunset); 
     b.setClickable(false); 
     progressDialog = ProgressDialog.show(SunriseSunset.this, "Loading", 
       "Please wait while fetching data"); 
     new LongRunningGetIO().execute(); 
    } 

...

protected void onPostExecute(String results) { 
progressDialog.dismiss(); 
       if (results != null) { 
        try {