0

第一次在这里发问题。刚开始编程和编写我的第一个应用程序。

我有一个具有 fetchUpdates() 方法的应用程序类文件:

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

DownloadJSONData 是一个asyncTask从服务器获取更新的方法,该onPostExecute方法使用来自服务器的 JSON 数组更新 sqlite 数据库。

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

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

动机:我正在尝试更改fetchUpdates()方法以返回一个布尔值,指示数据库是否已更新。但是,现在(我认为)方法在'fetchUpdates()方法之前完成,因此,方法无法指示调用是否更新了数据库。如果数据库在调用后更新,我需要调用该方法的应用程序组件表现不同。asyncTaskonPostExecutefetchUpdates()DownloadJSONData()fetchUpdates()

PS因为我是编程新手,所以简单而详细的解释会很有帮助。

谢谢!

4

2 回答 2

6

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

于 2013-03-19T09:47:21.783 回答
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应该处理错误/成功案例而不是它的调用者。

于 2013-03-19T09:56:21.850 回答