2012-09-14 178 views
0

我有一个活动类如下。等待后台任务的完成

public class LoginActivity extends Activity implements OnClickListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     button1 = (ImageView) findViewById(R.id.button1); 
     button1.setOnClickListener(this); 
    } 
    @Override 
    public void onClick(View v) { 
     BackgroundRunner bgRunner = new BackgroundRunner(this); 
     String[] params = new String[]{url}; 
     bgRunner.execute(params); 
    } 


} 

而且是的AsyncTask:

public class BackgroundRunner extends AsyncTask<String, Void, Boolean> { 

@Override 
protected Boolean doInBackground(String... params) { 
    ServiceCaller serviceCaller = new ServiceCaller(); 
    boolean status = serviceCaller.checkLogin(params[0]); 
    return status; 
} 

@Override 
public void onPreExecute(){ 
    progressBar = (ProgressBar) currentContext.findViewById(R.id.loader); 
    progressBar.setVisibility(View.VISIBLE); 
    } 

@Override 
public void onPostExecute(final Boolean status){ 
    progressBar.setVisibility(View.INVISIBLE); 
} 

}

下面是这种情况。主要活动类在点击上创建一个线程。然后创建的线程从服务器获取一些数据。这是一项耗时的任务。所以在UI上显示一个进度条。目前我正在使用AsyncTask来完成服务器数据检索。但真正的挑战是等待后台任务完成并从中获得价值。我正在寻找的是:

等到服务器调用完成并获得结果。同时显示进度条。我认为Handler会是一个选择。我对此不太清楚。

有什么想法?如果我混淆你的道歉。

在此先感谢!

+0

有没有你不使用,片段支持,而代之以AsychTask理由吗?有了一个片段(在你的情况下没有UI),你可以创建一个事务并询问结果,类似于你开始活动的结果 – quinestor

+0

我会试试看! – Renjith

回答

2

我的解决方案是创建自己的AsyncTask类:

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnCancelListener; 
import android.os.Handler; 
import br.com.zcr.ezcrm.R; 

public class AsyncTask implements Runnable { 

    private Activity activity; 
    private Handler handler; 
    private Action action; 
    private boolean showDialog = true; 
    private boolean running = false; 
    private boolean canceled = false; 

    private Thread t; 

    private ProgressDialog progress; 

    public AsyncTask(Activity activity) { 
     this.activity = activity; 
     handler = new Handler(); 
    } 

    public AsyncTask(Activity activity, Action action) { 
     this.activity = activity; 
     this.action = action; 
     handler = new Handler(); 
    } 

    private ProgressDialog getDialog() { 
     if (progress != null) 
      return progress; 
     progress = ProgressDialog.show(activity, null, activity.getString(R.string.carregando), true, false); 
     progress.setOnCancelListener(new OnCancelListener() { 
      public void onCancel(DialogInterface dialog) { 
       setCanceled(true); 
      } 
     }); 
     return progress; 
    } 

    private void showDialog() { 
     if (showDialog) 
      getDialog().show(); 
    } 

    private void hideDialog() { 
     if (showDialog) 
      getDialog().dismiss(); 
    } 

    public void execute(boolean showDialog) { 

     this.showDialog = showDialog; 
     execute(); 
    } 

    public void execute() { 

     if (running || action == null) 
      return; 

     running = true; 

     // Utils.setFixedOrientation(activity); 
     showDialog(); 
     t = new Thread(AsyncTask.this); 
     t.start(); 
    } 

    @Override 
    public void run() { 

     try { 

      final Object o = action.run(); 

      if (canceled) 
       return; 

      handler.post(new Runnable() { 
       public void run() { 
        action.onFinnish(o); 
       } 
      }); 

     } catch (final Exception e) { 

      if (canceled) 
       return; 

      handler.post(new Runnable() { 
       public void run() { 
        action.onError(e); 
       } 
      }); 

     } finally { 

      canceled = false; 
      hideDialog(); 
      // Utils.setUnfixedOrientation(activity); 
      running = false; 
     } 

    } 

    /* 
    * public void stop() { running = false; } 
    */ 
    public void setAction(Action a) { 
     action = a; 
    } 

    public void setCanceled(boolean canceled) { 
     if (canceled) 
      t = null; 
     this.canceled = canceled; 
    } 

    public interface Action { 
     /** Acao a ser executada */ 
     public Object run() throws Exception; 

     /** Chamado no fim de todas as execucoes */ 
     public void onFinnish(Object result); 

     /** Para qualquer execucao e retorna o erro */ 
     public void onError(Exception e); 
    } 

} 

而这正是实现:

AsyncTask task = new AsyncTask(this, new Action() { 
     public Object run() throws Exception { 
      return WebService.autenticate(login, pass); 
     } 
     public void onFinnish(Object result) { 
//result was returned in run method 
      verifyLogin((String) result); 
     } 
     public void onError(Exception e) { 
      //error 
     } 
    }); 
+1

我做了类似于你的东西。似乎现在工作! – Renjith

+0

看起来像JavaScript ajax调用样式:D –

0

取得进展对话框显示此代码之前:

dialog.show() 
bgRunner.execute(params); 

和的AsyncTask:

onPostExecute((final Boolean status){ 
    dialog.cancel() // MAKE DIALOG CANCEL 
} 

希望它会帮助你。