2015-12-31 64 views
0

我想實現進度條,而我的方法LlamadoServicio在後臺執行。正確執行線程與鎖定屏幕

我需要使用我的progressDialog鎖定屏幕並隱藏此元素才能完成「LlamadoServicio()」。

enter image description here

我的方法

progress = ProgressDialog.show(Menu.this, null, null, true); 
progress.setContentView(R.layout.elemento_progress_dialog); 

new Thread(new Runnable() { 
    public void run() { 

    LlamadoServicio("david"); 

    mHandler.post(new Runnable() { 
    public void run() { 
    progress.dismiss(); 
    } 
    });  
    } 
}).start(); 
+0

你的問題到底是什麼?代碼看起來合法 – ligi

+0

而不是'new Thread(new Runnable()...'需要嘗試[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask。html) – pRaNaY

+0

不確定你想實現什麼?無論如何,你的代碼越野車。它不建議在線程中使用處理程序。 – dhams

回答

5

您可以使用異步任務這一點。

private class AsyncTaskSample extends AsyncTask<Void, Void, Void> { 
    @Override 
    protected Void doInBackground(Void) { 
     LlamadoServicio("david"); 
    } 


    @Override 
    protected void onPostExecute(Void) { 
     progress.dismiss(); 
    } 


    @Override 
    protected void onPreExecute() { 
    // Things to be done before execution of long running operation. For 
    // example showing ProgessDialog 
     progress = ProgressDialog.show(Menu.this, null, null, true); 
     progress.setContentView(R.layout.elemento_progress_dialog); 
     progress.show(); 
    } 

} 

下面是關於android中的異步任務的幾個很好的參考。

http://codetheory.in/android-asynctask/

http://www.compiletimeerror.com/2013/01/why-and-how-to-use-asynctask.html#.Vo87yfl97IU

+0

此編碼有錯誤!但它類似於正確的答案 –

+1

@DavidHackro此代碼解決您的問題,這應該被標記爲最終答案 –

2

你的代碼需要做的是,它會顯示一個進度對話框,並開始通過調用LlamadoServicio("david")做的工作。同時,處理程序將忽略進度對話框。

有做這兩種方法:

1)使用AsyncTask,在onPreExecute()功能顯示進度對話框,叫LlamadoServicio("david")doInBackground功能和onPostExecute功能解散你的進度對話框。

2)如果你仍然想使用ThreadHandler,你需要如下更改代碼:

progress = ProgressDialog.show(Menu.this, null, null, true); 
progress.setContentView(R.layout.elemento_progress_dialog); 

new Thread(new Runnable() { 
    public void run() { 

    LlamadoServicio("david"); 

    } 
}).start(); 

LlamadoServicio代碼:

void LlamadoServicio(String value) { 
// do your job 
mHandler.sendEmptyMessage(0); 

} 

處理器代碼:

Handler mHandler = new Handler(new Handler.Callback() { 
      @Override 
      public boolean handleMessage(Message msg) { 
       progress.dismiss(); 
       return false; 
      } 
     }); 
0

正確執行線程

private class MyAsyncClass extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 

     progress = ProgressDialog.show(RegistroAuto.this, null, null, true); 
     progress.setContentView(R.layout.elemento_progress_dialog); 
     progress.show(); 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     autosConsulta = LlamadoServicio(placa); 
     if (autosConsulta != null) { 
      autosConsulta.setSerie(serie.replaceAll(" ","").trim()); 
      hp.nuevoAuto(autosConsulta); 
      startActivity(new Intent(RegistroAuto.this, PrincipalAutos.class)); 
      finish(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     progress.dismiss(); 
     finish(); 
     super.onPostExecute(result); 
    } 
} 
+0

我愛西班牙/意大利的編碼器。沒有什麼比混合使用英語和其他語言更好 – dominik4142

2

如果需要在你的代碼是在後臺運行鎖屏,我個人覺得你應該在這種情況下,使用異步任務。

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

    protected Void doInBackground(Void) { 
    /* do your background work */ 
    } 

    @Override 
    protected void onPostExecute(Void) { 
    progress.dismiss(); 
    } 


    @Override 
    protected void onPreExecute() { 
    // Things to be done before execution of long running operation. For 
    // example showing ProgessDialog 
    progress = ProgressDialog.show(Menu.this, null, null, true); 
    progress.setContentView(R.layout.elemento_progress_dialog); 
    // use this if you want to lock the screen. 
    progress.setCancelable(false); 
    progress.show(); 
    } 
} 

2.你正在做它的方式是錯誤的,因爲在run()方法,你會給呼叫服務調用方法:

LlamadoServicio("david"); 

比方說你的服務啓動,但這一呼籲不會阻止處理程序發佈可運行。因此它會駁回進度條。