2013-03-19 95 views
0

第一次在这里发布一个问题。刚开始编写和编写我的第一个应用程序。同步方法是否在UI线程(Android)的不同线程上运行?

我有了该方法fetchUpdates()的应用程序的类文件:

public synchronized void fetchUpdates() { 
    String[] mURLs = getURLs(); 
    new DownloadJSONData().execute(mURLs[0], mURLs[1]); 
} 

DownloadJSONData是asyncTask从服务器获取更新和onPostExecute方法使用JSON数组从服务器更新SQLite数据库。

应用程序的不同组件(小部件和活动)调用此方法以从服务器获取更新以更新数据库。

问题:synchronized方法是否在UI线程的单独线程上运行?如果是这样,将DownloadJSONData中的代码移动到同步的fetchUpdates()方法中应该没有问题吧?如果在连接服务器或从服务器下载数据时有阻碍,它不应该阻止UI线程正确吗?

动机:我试图改变fetchUpdates()方法返回一个指示数据库是否更新的布尔值。然而,因为它现在(我认为)fetchUpdates()方法在asyncTaskonPostExecute方法之前完成,因此,fetchUpdates()方法不能指示是否更新数据库的DownloadJSONData()的调用。如果数据库在调用后更新,我需要调用fetchUpdates()方法的应用程序组件的行为不同。

P.S.由于我是编程新手,简单而详细的解释将非常有用。

谢谢!

+0

我有一个问题给你。你为什么不在'AsyncTask'的'doInBackground()'方法中更新数据库?因为'onPostExecute()'在UI线程上运行,并且可能会导致Hickup。 – tolgap 2013-03-19 09:46:51

+0

这是一个很好的观点。我会带来改变。当我编写代码时没有考虑到这一点。感谢您指出了这一点! – fahmy 2013-03-19 09:50:09

回答

1

使用AsyncTask意味着大多数时候调用方法不会马上知道结果 - 除非您致电AsyncTask.get(),但您不想这样做并放弃异步方面。 假设您想在数据库更新时向用户显示一条消息,您应该执行的操作是启动AsyncTask并让它通过覆盖正确的方法来处理数据库更新的返回状态。我还要在两个不同的任务分解请求到服务器和数据库更新:

public class CallServer extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     // Do your request to the server 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (result == SUCCESS) { 
      // Display message to indicate successful request 
      new UpdateDatabase().execute(params); 
     } else { 
      // Display error message or whatever you want to do 
     } 
    } 
} 

public class UpdateDatabase extends AsyncTask<String, Void, Void> { 

    @Override 
    protected Void doInBackground(String... params) { 
     // Update the DB 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (result == SUCCESS) { 
      // Display success message or whatever you want to do 
     } else { 
      // Display error message or whatever you want to do 
     } 
    } 
} 

的主要思想是,AsyncTask应该处理的错误/成功案例,而不是它的调用者。

+0

我有一个服务,以给定的时间间隔调用'fetchUpdates()'方法来检查更新以更新数据库。假设我在连接到服务器失败时做了一个敬酒。即使应用没有按设定的时间间隔聚焦,敬酒也会弹出。理想情况下,当用户打开应用程序时(MainActivity.class调用onCreate上的fetchUpdates()),我希望吐司只弹出一次**。 – fahmy 2013-03-19 10:10:12

+0

然后,只有当您从主要活动调用状态消息时,才能显示状态消息,并通过将参数传递给AsyncTask从服务调用时什么也不做。只有在应用程序打开时才能调用它,您可以查看http://stackoverflow.com/a/151940/2003420 – bvidal 2013-03-19 10:42:02

6

不,同步方法运行在同一个线程中。但是,其他线程在执行时不能执行另一个同步方法(同一对象)。