2011-06-23 39 views
1

在我的應用程序中,我有一個processDialog(使用AsyncTask),並在doInbackground它從服務器獲取數據。 所有工作都很完美。 但我想如果互聯網很慢,那麼它會發出警告提示「與你的互聯網連接有問題」 因此,我想知道progressDialog需要解僱多少時間。所以我可以把一個條件,如果時間> 5imns那麼警報即將到來。android如何設置進度對話框的時間

我怎樣才能得到需要多少時間或如何設置對話框的時間。

plz有人回答我。 預先感謝您

我下面的代碼是存在的,

public class InfoActivity extends Activity { 

private TextView tvRestroName, tvRestroAddr, tvRestroArea, tvRestroCity, 
     tvRestroPhone, tvRestroRating, tvRestroCuisines, tvRestroAttr; 
private ImageView imgRestro; 
private ImageAdapter coverImageAdapter = new ImageAdapter(this); 
private ScrollView sv; 
static Bitmap restroBitmap, selectedImage; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    // This activity has two different views so to bind two views 
    // LinearLayout is used here 
    // from two views one is xml and another is coverflow class 
    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    LayoutInflater inflater = (LayoutInflater) this 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View view = inflater.inflate(R.layout.info, null); 

    // adding one view as xml 
    ll.addView(view); 

    CoverFlow coverFlow; 
    coverFlow = new CoverFlow(this); 
    coverFlow.setAdapter(new ImageAdapter(this)); 
    // set Imageadapter which is define within InfoActivity class 
    coverFlow.setAdapter(coverImageAdapter); 

    coverFlow.setSpacing(-25); 
    coverFlow.setSelection(4, true); 
    coverFlow.setAnimationDuration(1000); 
    // and another view as class 
    ll.addView(coverFlow); 
    sv = new ScrollView(this); 
    sv.addView(ll); 

    // To add all views to InfoActivity 
    setContentView(sv); 
    // to initialize all variables like textview and imageview 
    setupViews(); 
    // for progress dialog 
    new DownloadTask().execute(this); 

    // click event of images within imageadapter 
    coverFlow.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> arg0, View arg1, 
       int position, long arg3) { 
      Toast.makeText(InfoActivity.this, "" + (position + 1), 
        Toast.LENGTH_SHORT).show(); 
      // imageView.setImageResource(mImageIds[arg2]); 
      String slImg = TabHostActivity.galleryArray[position]; 
      selectedImage = loadBitmap(slImg); 
      Intent i = new Intent(InfoActivity.this, 
        PostCommentActivity.class); 
      startActivity(i); 

     } 
    }); 
} 

// to initialize all variables like textview and imageview 
private void setupViews() { 
    imgRestro = (ImageView) findViewById(R.id.imageResturant); 
    tvRestroName = (TextView) findViewById(R.id.tvRestroName); 
    tvRestroAddr = (TextView) findViewById(R.id.tvRestroAddr); 
    tvRestroArea = (TextView) findViewById(R.id.tvRestroArea); 
    tvRestroCity = (TextView) findViewById(R.id.tvRestroCity); 
    tvRestroPhone = (TextView) findViewById(R.id.tvRestroPhone); 
    tvRestroRating = (TextView) findViewById(R.id.tvRestroRating); 
    tvRestroCuisines = (TextView) findViewById(R.id.tvRestroCuisines); 
    tvRestroAttr = (TextView) findViewById(R.id.tvRestroAttributes); 
} 

// set values to all fields 
private void setupValues() { 
    tvRestroName.setText("Restaurant " + TabHostActivity.restroName); 
    //Bitmap bmp = loadBitmap(TabHostActivity.restroImageurl); 
    System.out.println("str ;" + TabHostActivity.restroImageurl); 

    imgRestro.setImageBitmap(Bitmap.createScaledBitmap(restroBitmap, 300, 300, true)); 
    System.out.println("Image seted"); 
    tvRestroAddr.setText("Address: " + TabHostActivity.addr); 
    tvRestroArea.setText("Area: " + TabHostActivity.area); 
    tvRestroCity.setText("City:" + TabHostActivity.city); 

    String phones = "Phones: "; 
    for (int i = 0; i < TabHostActivity.phoneArray.length; i++) 
     phones += TabHostActivity.phoneArray[i] + ", "; 
    tvRestroPhone.setText(phones.substring(0, phones.length() - 2)); 

    tvRestroRating.setText("Rating: " + TabHostActivity.rating); 

    String cuisines = "Cuisines: "; 
    for (int i = 0; i < TabHostActivity.cuisinesArray.length; i++) 
     cuisines += TabHostActivity.cuisinesArray[i] + ", "; 
    tvRestroCuisines.setText(cuisines.substring(0, cuisines.length() - 2)); 

    String attr = "Attributes: "; 
    for (int i = 0; i < TabHostActivity.attributesArray.length; i++) 
     attr += TabHostActivity.attributesArray[i] + ", "; 
    tvRestroAttr.setText(attr.substring(0, attr.length() - 2)); 
} 

// to get image from url in form of bitmap 
private static Bitmap loadBitmap(String url) { 
    URL myFileUrl = null; 
    InputStream is = null; 
    try { 
     myFileUrl = new URL(url); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
    try { 
     HttpURLConnection conn = (HttpURLConnection) myFileUrl 
       .openConnection(); 
     conn.setDoInput(true); 
     conn.connect(); 
     is = conn.getInputStream(); 
     Log.i("i m connected", "Download in info for main image"); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    Log.i("i m connected", "Download in info for main image"); 
    return BitmapFactory.decodeStream(is); 
} 

// for progressdialog 
private class DownloadTask extends AsyncTask<Context, Integer, Void> { 

    private ProgressDialog Dialog = new ProgressDialog(InfoActivity.this); 

    @Override 
    protected void onPreExecute() { 
     System.out.println("In onPreExecute "); 
     Dialog.setTitle("Loading"); 
     Dialog.setMessage("Please wait for few seconds..."); 
     //Dialog.setMax(100); 
     //Dialog.setProgress(0); 
     Dialog.show(); 

    } 

    @Override 
    protected Void doInBackground(Context... params) { 
     System.out.println("In doInBackground "); 
     //examineJSONFile(); 
     restroBitmap= loadBitmap(TabHostActivity.restroImageurl); 
     System.out.println("conversion of bitmap done"); 
     int i = 0; 

     System.out.println("In doInBackground "); 
     Dialog.dismiss(); 
     //Dialog.cancel(); 
     for (i = 0; i < 10; i++) 
      System.out.println("In doInBackground " + i); 

     Bitmap bitmap = null; 
     for (i = 0; i < TabHostActivity.galleryArray.length; i++) { 
      try { 
       publishProgress(i); 

      } catch (Exception e) { 
       Log.i("in while", e.getMessage()); 
      } 

      bitmap = loadBitmap(TabHostActivity.galleryArray[i]); 
      TabHostActivity.bitmapHash.remove(TabHostActivity.galleryArray[i]); 
      TabHostActivity.bitmapHash.put(TabHostActivity.galleryArray[i], bitmap); 

     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     if (progress[0]==0) { 
      setupValues(); 
      System.out.println("setupvalues"); 
     } else { 
      System.out.println("In progress "); 
      coverImageAdapter.setnotify(); 
     } 
    } 

    @Override 
    protected void onPostExecute(Void arg) { 
     System.out.println("In onPostExecute "); 
     } 
} 

public class ImageAdapter extends BaseAdapter { 
    int mGalleryItemBackground; 
    private Context mContext; 
    private BitmapDrawable drawable; 
    private FileInputStream fis; 

    public ImageAdapter(Context c) { 
     mContext = c; 
     } 

    public int getCount() { 
     return TabHostActivity.galleryArray.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public void setnotify() { 
     notifyDataSetChanged(); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 
     fetchDummy(TabHostActivity.galleryArray[position], i); 
     i.setLayoutParams(new CoverFlow.LayoutParams(200, 200)); 
     i.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 

     // Make sure we set anti-aliasing otherwise we get jaggies 
     drawable = (BitmapDrawable) i.getDrawable(); 
     try { 
      drawable.setAntiAlias(true); 
     } catch (Exception e) { 
      System.out.println("Exception in getview :" + e); 
     } 

     return i; 

     // return mImages[position]; 
    } 

    /** 
    * Returns the size (0.0f to 1.0f) of the views depending on the 
    * 'offset' to the center. 
    */ 
    public float getScale(boolean focused, int offset) { 
     /* Formula: 1/(2^offset) */ 
     return Math.max(1, 2.0f/(float) Math.pow(2, Math.abs(offset))); 
    } 

    private void fetchDummy(String urlString, ImageView i) { 
     if (TabHostActivity.bitmapHash.containsKey(urlString)) { 
      i.setImageBitmap(TabHostActivity.bitmapHash.get(urlString)); 
     } 
    } 

} 
+0

的[?我怎樣才能關閉ProgressDialog在設定時間後(可能的複製http://stackoverflow.com/questions/29153378/how-can-i-close-a-progressdialog-after-a-set-time) –

+0

我認爲這是最快最好的方法,也是因爲對你的代碼影響很小 http:// stackoverflow.com/a/29153578/3395760 –

回答

2

在創建異步任務(無論是在類的創建,或在onPreExecute())只需跟蹤的開始時間。然後每個onProgressUpdate()檢查已經發生多久,並做適當的超時邏輯。

如果你只使用進度簡單的微調對話框而不是調用onProgressUpdate(),那麼你將不得不重新設計你的doInBackground定期調用它,你可以只顯示在onProgressUpdate(),而不是在用戶界面的變化後臺線程。

編輯:評論您已上傳的代碼。使用BitmapFactory.decodeStream(is)表示您無法輕鬆檢查網絡緩慢。

您可以更改此操作,以便在讀取循環中將流加載到byte[]中,並監視其所需的時間,然後在donInBackground()方法太慢時拋出超時異常。然後,doInBackground()可以捕獲異常並將相應的代碼返回給onPostExecute()

onPostExecute()需要一個int參數,並決定在那裏做什麼,例如,如果你傳遞一個代碼0,它可以假設一切正常,並關閉對話框。如果它變爲1,則假定出現超時並關閉對話框,然後顯示「您的連接超時」消息。

粗略地講代碼是(我沒有嘗試過這一點):

 // ... 
     conn.setDoInput(true); 
     conn.connect(); 
     is = conn.getInputStream(); 
     Log.i("i m connected", "Download in info for main image"); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    Log.i("i m connected", "Download in info for main image"); 

    // read the InputStream into an array 
    long startTime = System.currentTimeMillis(); 
    ByteArrayOutputStream buffer = new ByteArrayOutputStream(); 
    int nRead; 
    byte[] data = new byte[16384]; 

    while ((nRead = is.read(data, 0, data.length)) != -1) { 
     buffer.write(data, 0, nRead); 
     if ((System.currentTimeMillis() - startTime) > 60000) { 
      is.close(); 
      throw new MyTimeoutException(); 
     } 
    } 
    return BitmapFactory.decodeByteArray(buffer.toByteArray()); 
} 

@Override 
protected Integer doInBackground(Context... params) { 
    // ... 

    Bitmap bitmap = null; 
    for (i = 0; i < TabHostActivity.galleryArray.length; i++) { 
     try { 
      publishProgress(i); 

     } catch (Exception e) { 
      Log.i("in while", e.getMessage()); 
     } 

     try { 
      bitmap = loadBitmap(TabHostActivity.galleryArray[i]); 
     } catch (MyTimeoutException e) { 
      return RESULT_TIMEOUT; 
     } 
     TabHostActivity.bitmapHash.remove(TabHostActivity.galleryArray[i]); 
     TabHostActivity.bitmapHash.put(TabHostActivity.galleryArray[i], bitmap); 

    } 
    return RESULT_OK; 
} 

@Override 
protected void onPostExecute(Integer resultCode) { 
    if (resultCode == RESULT_OK) { 
     // ... things were good, close dialog etc 
    } else { 
     // ... close spinner and show a "timeout" dialog 
    } 
} 
+0

我會在這裏發送我的代碼 – Jyosna

+0

只是檢查我的代碼,並告訴我該怎麼做?謝謝 – Jyosna

+0

@Jyosna我根據你的代碼更新了我的答案 –