我是Android新手,我不知道如何做一些事情。我的应用程序有一个活动,在onCreate
函数中,我需要从远程服务器获取一些异步数据并对其进行处理。我有一个不同的类,一个服务,用于检索数据并完成相关工作。我也想告诉用户工作进度,所以我正在实施委托模式。Android上委托模式的问题
所以,我的活动是这样的:
public class HomeActivity extends FragmentActivity implements UpdateLibraryDelegate{
....
protected void onCreate(Bundle savedInstanceState) {
....
UpdateLibraryTask updateLibraryTask = new UpdateLibraryTask();
updateLibraryTask.setUpdateLibrarayDelegate(this);
updateLibraryTask.execute();
}
private class UpdateLibraryTask extends AsyncTask<Void, Void, Void>{
private UpdateLibraryDelegate updateLibraryDelegate;
@Override
protected Void doInBackground(Void... params) {
myService.setUpdateLibraryDelegate(updateLibraryDelegate);
myService.updateLibrary();
return null;
}
public void setUpdateLibrarayDelegate(UpdateLibraryDelegate updateLibraryDelegate){
this.updateLibraryDelegate = updateLibraryDelegate;
}
}
/**DELEGATION METHODS**/
@Override
public void startDownloadingLibrary() {
...
}
@Override
public void endDownloadingLibrary() {
...
}
@Override
public void processingLibrary(final int progress) {
}
我的服务有这样的事情:
public void updateLibrary(){
...
if(updateLibraryDelegate!=null){
updateLibraryDelegate.startDownloadingLibrary();
}
get(library_client, url, null, library_response_handler);
}
public JsonHttpResponseHandler library_response_handler = new JsonHttpResponseHandler() {
@Override
public void onSuccess(JSONObject jsonObject)
{
if(updateLibraryDelegate!=null){
updateLibraryDelegate.endDownloadingLibrary();
}
for(...){
//PROCESSING DATA
updateLibraryDelegate.processingLibrary(process);
}
}
}
有了这些代码的地方,它似乎做工精细,委托函数得到在他们应该时打电话。当我尝试在UI上显示任何内容时,问题就来了。如果我试试这个:
@Override
public void startDownloadingLibrary() {
if(progressDialog==null){
progressDialog = new ProgressDialog(ctx);
}
progressDialog.setProgress(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("Downloading Stories, This may take a while...");
progressDialog.show();
}
我得到一个异常:
09-23 14:08:00.850: E/AndroidRuntime(11336): FATAL EXCEPTION: AsyncTask #1
09-23 14:08:00.850: E/AndroidRuntime(11336): java.lang.RuntimeException: An error occured while executing doInBackground()
09-23 14:08:00.850: E/AndroidRuntime(11336): at android.os.AsyncTask$3.done(AsyncTask.java:299)
09-23 14:08:00.850: E/AndroidRuntime(11336): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
09-23 14:08:00.850: E/AndroidRuntime(11336): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
09-23 14:08:00.850: E/AndroidRuntime(11336): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
09-23 14:08:00.850: E/AndroidRuntime(11336): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
09-23 14:08:00.850: E/AndroidRuntime(11336): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
09-23 14:08:00.850: E/AndroidRuntime(11336): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
09-23 14:08:00.850: E/AndroidRuntime(11336): at java.lang.Thread.run(Thread.java:841)
09-23 14:08:00.850: E/AndroidRuntime(11336): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
09-23 14:08:00.850: E/AndroidRuntime(11336): at android.os.Handler.<init>(Handler.java:197)
我发现,这是因为我上运行一个线程,不是UI线程的方法,并将该溶液这样的:
public void startDownloadingLibrary() {
new Thread(){
public void run(){
HomeActivity.this.runOnUiThread(new Runnable(){
@Override
public void run() {
if(progressDialog==null){
progressDialog = new ProgressDialog(ctx);
}
progressDialog.setProgress(ProgressDialog.STYLE_SPINNER);
progressDialog.setMessage("Downloading Stories, This may take a while...");
progressDialog.show();
}
});
}
}.start();
}
但如我所料,这并不工作,但委托的功能越来越被称为权,代码run
方法中它不是直到DAT的处理执行a完成了。
什么是正确的方式告知用户有关异步过程的进度?
有没有什么办法可以在不使用runOnUiThread
函数的情况下在我的代理函数上显示对话框?
我将不胜感激任何帮助...
谢谢!
为什么你在startDownloading中创建另一个线程,从HomeActivity.this.runOnUiThread开始... –