正确实现带锁定屏幕的线程

时间:2015-12-31 19:36:27

标签: java android multithreading

我在我的方法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();

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您的代码将执行的操作是,它将显示一个进度对话框,并将通过调用LlamadoServicio("david")开始执行其工作。同时,处理程序将关闭进度对话框。

有两种方法可以做到这一点:

1)使用AsyncTask,在onPreExecute()函数中显示进度对话框,在LlamadoServicio("david")函数中调用doInBackground并在onPostExecute函数中关闭进度对话框。< / p>

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;
            }
        });

答案 2 :(得分: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");

假设您的服务已启动,但此调用不会阻止处理程序发布runnable。因此它将取消进度条。

答案 3 :(得分: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);
    }
}