【问题标题】:Use asynctask with exception networkOnMainThreadException使用带有异常 networkOnMainThreadException 的 asynctask
【发布时间】:2012-08-21 10:20:26
【问题描述】:

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

android.os.NetworkOnMainThreadException

我已阅读有关该错误的信息,这是因为我需要在主要操作之外执行一个线程,但不明白如何调用函数 asyncsTask,因为我需要发送共享首选项作为参数。 --------------------- 我需要将函数 isAuthenticated 或他的代码的一部分放在 AsyncTask 中,但需要发送首选项作为参数,我不知道该怎么做

我放了一部分代码。

这里打电话

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

类 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;
}     

有什么办法吗?

谢谢

【问题讨论】:

  • 我遇到了同样的错误。请您在添加异步任务的位置发布完整代码。我会非常感谢你。
  • 你好,你可以提出一个问题,我会给你一个更完整的答案
  • 感谢您的回复。但我已经发布了我的问题。你可以在这里查看:stackoverflow.com/questions/14316941/…

标签: android exception android-asynctask


【解决方案1】:

替换你的代码:

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);

【讨论】:

    【解决方案2】:

    当您调用 twitter.getAccountSettings() 时,此方法会发出网络请求,并且与所有请求一样,它必须在线程上完成。您需要传递 sharedpreferences 的事实不会改变任何事情。

    要将一些参数传递给 AsyncTask,必须像这样抛出方法 execute(): new DownloadFilesTask().execute(url1, url2, url3);

    更多信息在这里:http://developer.android.com/reference/android/os/AsyncTask.html

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-16
        • 2015-01-01
        • 1970-01-01
        • 2012-12-14
        • 2014-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多