同步方法是否在与UI线程(Android)不同的线程上运行?

时间:2013-03-19 09:42:50

标签: java android android-asynctask synchronized

这是第一次发布问题。刚开始编程和编码我的第一个应用程序

我有一个Application类文件,其文件方法为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()方法在asyncTask的{​​{1}}方法之前完成,因此,onPostExecute方法无法指示是否调用{{ 1}}更新了数据库。如果数据库在调用后更新,我需要调用fetchUpdates()方法的应用程序组件以不同的方式运行。

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

谢谢!

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分: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应该处理错误/成功案例,而不是其调用者。