2012-11-23 232 views
0

我想在網格視圖中加載圖像時顯示進度對話框。
我面臨的問題是當前線程和進度對話線程同時運行。如何等待線程直到另一個線程完成

public String Method1(){ 
     String output=""; 
     final ProgressDialog aProgDialogL = ProgressDialog.show(this, "", "Loading..."); 
     Thread thread = new Thread() { 
      public void run() { 
       //My codes 
       aHandlerL.post(new Runnable() { 
        @Override 
        public void run() { 
         //Post Runnable codes 
         aProgDialogL.dismiss(); 
        } 
       }); 
      } 
     }; 
     thread.start(); 

     /* 
     * 
     * 
     * OTHER CODES 
     * 
     * 
     */ 
     return output; 
} 

在上面的例子中,我需要運行Progress Dialog Thread中的代碼。完成執行後,我需要運行我的「其他代碼」。怎麼做?

我試過使用異步任務。在異步任務完成之前,方法1會被取消並重新生成字符串。

public String Method1(){ 
    String result=""; 
    new GetImages().execute(); 
    return result; 

} 
public class GetData extends AsyncTask<Void, Void, Integer>{ 

    @Override 
    protected void onPreExecute() { 
     aProgDialogL = ProgressDialog.show(Main.this, "", "Loading..."); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 
     //Progress Dialig Code 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     aProgDialogL.dismiss(); 
     //OTHER CODES 
     super.onPostExecute(result); 
    } 

} 
+0

「其他代碼」究竟發生了什麼? UI操作還是別的? – Tudor

+0

我不應該返回對象,直到進度對話框線程完成。 UI操作也在那裏。 – Vignesh

+0

在onExExecute()中執行pd.show()並在onPostexecute()中關閉它。在doInBackGround() – Raghunandan

回答

1

您可以使用異步任務使用的AsyncTask。 http://developer.android.com/reference/android/os/AsyncTask.html。這裏有一個很好的教程。 http://www.vogella.com/articles/AndroidPerformance/article.html.Also看看這個鏈接 http://developer.android.com/guide/components/processes-and-threads.html。使用asynctask根據您的需要進行修改。

 doInBackground()- For long running operations. Don't update ui here. 
    onPreExecute()- update ui before running the operatio nin background. 
    onPostExecute()- update ui after running the operation. 
+0

中下載文件等你的長時間運行操作我嘗試使用asyc任務,但我仍然無法做到。我的問題中添加了我的asyc任務代碼。請檢查並告訴我需要做的更改。 – Vignesh

+0

有一個很好的例子和由vogella教程。看一看。如果你谷歌,你可以得到asynctask的工作示例。 – Raghunandan

+0

謝謝拉古丹丹 – Vignesh

0

我建議您解決問題

http://p-xr.com/merging-2-tutorials-xml-data-progressdialog-using-asynctask/ 

http://p-xr.com/android-tutorial-how-to-make-a-progress-dialog/ 

http://developer.android.com/reference/android/os/AsyncTask.html 
1

我建議你採取一些不同的方法。

不涉及Method1()函數中的任何線程,而是您的Method1()函數應該在單獨的線程下運行。

下面的代碼會幫助你。

public class MainActivity extends Activity { 

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

     ((Button) findViewById(R.id.btnPopup)) 
      .setOnClickListener(new OnClickListener() { 


      public void onClick(View v) { 

       new Thread() { 
        public void run() { 

         String answer = Method1(); 

         runOnUiThread(new Runnable() { 

          @Override 
          public void run() { 
           // Here you will write the code which is 
           // to be executed on main thread. 

          } 
         }); 
        }; 
       }.start(); 
      } 
     }); 

    } 

    public String Method1() { 
     // Write code 

     return "result"; 
    } 
} 
+0

+1。這是一個好主意。 – Tudor

0

取而代之的是:特定時間後停止怎麼樣使用定時器您的線程,並編寫代碼,你要停止發言一樣,經過:

Timer timer=new Timer(); 
timer.schedule(new TimerTask() { 
@Override 
public void run() { 
    thread.stop; 
     // Other code } 

},時間你想要的);

+0

我需要運行線程中的所有代碼。我無法預測代碼需要多長時間才能完成。 – Vignesh

相關問題