綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[求助] ProgressDialog的問題

[複製連結] 查看: 1139|回覆: 7|好評: 0
跳轉到指定樓層
樓主
wind8894 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2012-8-22 00:41

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
我有一隻程式是抓網路上的圖片,想用ProgressDialog和setConnectTimeout去防止網頁消失或是逾時的狀況發生

如果網址錯誤,就會使程式崩潰,所以要設setConnectTimeout去跳出Dialog告訴使用者

然後現在卡在 不管是正確網址或錯誤網址,ProgressDialog會跑完就跳出錯誤

這隻程式應該是要寫成按下button之後 先跑ProgressDialog,因為網址是錯的 ,所以他會逾時,最後跳出Dialog

我在想是不是這邊的path沒有傳進去另一個function所以才一直再讀取ProgressDialog呢?


  1. import java.net.SocketTimeoutException;
  2. import java.net.URL;
  3. import android.app.Activity;
  4. import android.app.AlertDialog;
  5. import android.app.ProgressDialog;
  6. import android.content.DialogInterface;
  7. import android.graphics.Bitmap;
  8. import android.graphics.BitmapFactory;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.Button;
  13. import android.widget.EditText;
  14. import android.widget.ImageView;
  15. import java.net.HttpURLConnection;



  16. public class Checkurl1Activity extends Activity {
  17.         EditText firstNum,secondNum,threeNum;
  18.         Button test;
  19.         private ImageView mImageView;  //imageView1
  20.         private Bitmap bm;
  21.         private ProgressDialog pd1;        
  22.        
  23.        
  24.         @Override
  25.         public void onCreate(Bundle savedInstanceState)
  26.         {
  27.                 super.onCreate(savedInstanceState);
  28.                 setContentView(R.layout.main);
  29.                
  30.                 firstNum = (EditText)findViewById(R.id.editText1);        
  31.                 secondNum = (EditText)findViewById(R.id.editText2);
  32.                 threeNum = (EditText)findViewById(R.id.editText3);
  33.                 mImageView = (ImageView) findViewById(R.id.imageView1);
  34.                
  35.                 test = (Button)findViewById(R.id.button1);
  36.                 test.setOnClickListener(new OnClickListener()
  37.         {
  38.                 public void onClick(View v)
  39.                 {
  40.                        
  41.                         String num1 = firstNum.getText().toString();                        
  42.                             String num2 = secondNum.getText().toString();
  43.                             String num3 = threeNum.getText().toString();
  44.                             final String path="http://"+num1+"/snapshot.cgi?user="+num2+"&pwd="+num3;
  45.                            
  46.                            
  47.                             if(path.equals(""))
  48.                     {
  49.                       showDialog("網址不可為空白!");
  50.                     }
  51.                     else
  52.                     {
  53.                            
  54.                       /* 傳入type=1為預覽圖檔 */
  55.                       //setImage(path,1);
  56.                            
  57.                             pd1 = ProgressDialog.show(Checkurl1Activity.this, null, "Loading...");  
  58.                         new Thread(path)
  59.                         {  
  60.                              
  61.                             public void run()
  62.                             {                                     
  63.                                     setImage(path,1);
  64.                             }  
  65.                         }.start();
  66.                     }
  67.                 }
  68.         });
  69.                
  70.         }
  71.        
  72.         private void setImage(String path,int type)
  73.           {
  74.             try
  75.             {  
  76.              
  77.               URL url = new URL(path);              
  78.               HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
  79.               urlCon.setConnectTimeout(3000);
  80.               urlCon.setReadTimeout(3000);
  81.               urlCon.connect();
  82.              
  83.               if(type==1)
  84.               {
  85.                 /* 預覽圖檔 */
  86.                 bm = BitmapFactory.decodeStream(urlCon.getInputStream());
  87.                 mImageView.setImageBitmap(bm);
  88.                 pd1.dismiss();
  89.                
  90.               }
  91.              
  92.             }
  93.             catch (SocketTimeoutException e)
  94.             {                     
  95.                     pd1.dismiss();
  96.                     showDialog("連線逾時");
  97.                                        
  98.         }
  99.             catch (Exception e)
  100.             {
  101.                     pd1.dismiss();
  102.                     showDialog("讀取錯誤!網址可能不是圖檔或網址錯誤!");
  103.                    
  104.               bm = null;
  105.               mImageView.setImageBitmap(bm);
  106.               //mButton2.setEnabled(false);
  107.               e.printStackTrace();
  108.             }
  109.              
  110.           }
  111.        
  112.           
  113.           /* 跳出Dialog的method */
  114.           private void showDialog(String mess){
  115.             new AlertDialog.Builder(Checkurl1Activity.this).setTitle("Message")
  116.             .setMessage(mess)
  117.             .setNegativeButton("確定", new DialogInterface.OnClickListener()
  118.             {
  119.               public void onClick(DialogInterface dialog, int which)
  120.               {         
  121.               }
  122.             })
  123.             .show();
  124.           }  
  125.         }
複製代碼
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
ploglin | 收聽TA | 只看該作者
發表於 2012-8-22 10:37
把LogCat中的錯誤訊息貼上來,找問題比較快。
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-8-22 10:46
本帖最後由 wind8894 於 2012-8-23 14:14 編輯
  1. 08-22 02:45:49.192: W/dalvikvm(1380): threadid=9: thread exiting with uncaught exception (group=0x40015560)

  2. 08-22 02:45:49.200: E/AndroidRuntime(1380): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
  3. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at android.os.Handler.<init>(Handler.java:121)
  4. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at android.app.Dialog.<init>(Dialog.java:101)
  5. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at android.app.AlertDialog.<init>(AlertDialog.java:63)
  6. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at android.app.AlertDialog.<init>(AlertDialog.java:59)
  7. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at android.app.AlertDialog$Builder.create(AlertDialog.java:786)
  8. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at android.app.AlertDialog$Builder.show(AlertDialog.java:801)
  9. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at com.shu.Checkurl2Activity.showDialog(Checkurl2Activity.java:128)
  10. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at com.shu.Checkurl2Activity.setImage(Checkurl2Activity.java:107)
  11. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at com.shu.Checkurl2Activity.access$2(Checkurl2Activity.java:77)
  12. 08-22 02:45:49.200: E/AndroidRuntime(1380):         at com.shu.Checkurl2Activity$1$1.run(Checkurl2Activity.java:68)
  13. 08-22 02:45:52.111: I/Process(1380): Sending signal. PID: 1380 SIG: 9
複製代碼
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
ploglin | 收聽TA | 只看該作者
發表於 2012-8-22 13:37
你在 Thread 的  run() 最前面,加上 Looper.prepare() 試試
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-8-22 13:56
加了之後又產生這些logcat,也是轉幾圈之後就產生錯誤
  1. 08-22 05:52:04.080: E/AndroidRuntime(521): FATAL EXCEPTION: Thread-10
  2. 08-22 05:52:04.080: E/AndroidRuntime(521): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
  3. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
  4. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.view.ViewRoot.invalidateChild(ViewRoot.java:642)
  5. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:668)
  6. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.view.ViewGroup.invalidateChild(ViewGroup.java:2511)
  7. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.view.View.invalidate(View.java:5279)
  8. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.widget.ImageView.setImageDrawable(ImageView.java:323)
  9. 08-22 05:52:04.080: E/AndroidRuntime(521):         at android.widget.ImageView.setImageBitmap(ImageView.java:336)
  10. 08-22 05:52:04.080: E/AndroidRuntime(521):         at com.shu.Checkurl2Activity.setImage(Checkurl2Activity.java:113)
  11. 08-22 05:52:04.080: E/AndroidRuntime(521):         at com.shu.Checkurl2Activity.access$2(Checkurl2Activity.java:79)
  12. 08-22 05:52:04.080: E/AndroidRuntime(521):         at com.shu.Checkurl2Activity$1$1.run(Checkurl2Activity.java:70)
複製代碼
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

6
ploglin | 收聽TA | 只看該作者
發表於 2012-8-22 16:25
如果要異動 view 的內容,不能在 thread 本身去異常,你必需要在 run() 結束時,利用 handler 去異常 view 的內容
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

7
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-8-23 11:12
最後改用AsyncTask就能做到了~
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

8
ploglin | 收聽TA | 只看該作者
發表於 2012-8-23 15:02
主要還是因為 Thread 中的 run() 不可以含有 Layout 被異動的動作。

Thread 其實還是跟主程式用的是同一個線程
AsyncTask 則是另外生一個新的線程
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則