使用带有异常networkOnMainThreadException的asynctask

时间:2012-08-21 10:20:27

标签: android exception android-asynctask

我已经在模拟器上的应用程序中使用twitter实现了一些操作,但是在实际设备上,我有一个例外:

android.os.NetworkOnMainThreadException

我已经读过这个错误,因为我需要从主操作中做一个线程,但是不了解如何调用函数asyncsTask,因为我需要发送Shared Preferences作为参数。       --------------------- 我需要把函数isAuthenticated或他的代码的一部分放在AsyncTask中但需要发送prefs作为参数而我不是如何做到的

我放了一部分代码。

HERE CALL

if (TwitterUtils.isAuthenticated(prefs)) {   
......
.....
....
}

IN CLASS TwitterUtils.java

public static boolean isAuthenticated(SharedPreferences prefs){

String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

AccessToken a = new AccessToken(token,secret);
Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
twitter.setOAuthAccessToken(a);


try {         
    twitter.getAccountSettings(); **LINE ERROR**
    return true;
} catch (TwitterException e) {
    e.printStackTrace();
    return false;
}     

任何解决方案?

由于

3 个答案:

答案 0 :(得分:3)

替换您的代码:

if (TwitterUtils.isAuthenticated(prefs)) {   
......
.....
....
}

以下内容:

    new AsyncTask<SharedPreferences,Object, Boolean>() {

        @Override
        protected Boolean doInBackground(SharedPreferences... params) {
            return TwitterUtils.isAuthenticated(params[0]);
        }

        @Override
        protected void onPostExecute(Boolean isAuthenticated) {
            if (isAuthenticated) {
                // Do processing after successful authentication
            }
            else {
                // Do processing after authentication failure
            }
        }
    }.execute(prefs);

答案 1 :(得分:0)

当你调用twitter.getAccountSettings()时,这个方法发出网络请求,就像所有请求一样,它必须在一个线程上完成。您需要传递共享首选项的事实不会改变任何内容。

要将一些参数传递给AsyncTask,必须完成抛出方法execute(),如下所示: new DownloadFilesTask()。execute(url1,url2,url3);

此处提供更多信息:http://developer.android.com/reference/android/os/AsyncTask.html

答案 2 :(得分:0)

尝试使用Asynac tasks来避免这种情况。 检查this out.it将回答您的问题。