2013-09-23 47 views
0

我是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函数的情况下在我的代理函数上显示对话框?

我将不胜感激任何帮助...

谢谢!

+0

为什么你在startDownloading中创建另一个线程,从HomeActivity.this.runOnUiThread开始... –

回答