1

我有以下 2 节课

class CallNetworkMethod extends AsyncTask<Void, Void, Void>
{

    @Override
    protected Void doInBackground(Void... params) {

        if (TwitterUtils.isAuthenticated(prefs)) {
            sendTweet();
        } else {

            Intent i = new Intent(getApplicationContext(), TwPrepareRequestTokenActivity.class);
            i.putExtra("tweet_msg",getTweetMsg());
            startActivity(i);
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //updateLoginStatus();
        loginStatus.setText("Logged into Twitter : " + TwitterUtils.isAuthenticated(prefs));
    }

}

==================================================== ==

public class TwitterUtils {

static ArrayList<String> friens=null;

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(TwConstants.CONSUMER_KEY, TwConstants.CONSUMER_SECRET);

    twitter.setOAuthAccessToken(a);


    try {



        **twitter.getAccountSettings();**

        return true;
    } catch (TwitterException e) {
        return false;
    }
}

}

运行此代码时出现异常(networkonmainthreadexception)。我调试此代码并找到异常出现的位置。它是twitter.getAccountSettings(); .我认为这个方法应该在 AsynTask 中运行,但我不知道该怎么做。

4

4 回答 4

1

问题是你用AsyncTask错了。onBackground返回值和接收结果的想法onPostExecute是将在后台线程上完成的事情传递给 UI 线程。

像这样的东西:

更改class CallNetworkMethod extends AsyncTask<Void, Void, Void>

class CallNetworkMethod extends AsyncTask<Void, Void, Boolean>

更改protected Void doInBackground(Void... params) {

protected Boolean doInBackground(Void... params) {

   Boolean result = TwitterUtils.isAuthenticated(prefs);
        if (result) {
        sendTweet();
    } else {

        Intent i = new Intent(getApplicationContext(), TwPrepareRequestTokenActivity.class);
        i.putExtra("tweet_msg",getTweetMsg());
        startActivity(i);
    }
    return result;       
}

并将其更改protected void onPostExecute(Void result) {

protected void onPostExecute(Boolean result) {
    loginStatus.setText("Logged into Twitter : " + result.toString());
}
于 2013-01-10T09:49:16.783 回答
1

目前您正在调用TwitterUtils.isAuthenticated(prefs)onPostExecute因为 onPostExecute 总是在 UI 线程上执行,然后您会遇到networkonmainthreadexception异常。

为避免此问题,请使用 aBoolean Flag从 doInBackground 获取返回并TextView在 onPostExecute 中显示为:

class CallNetworkMethod extends AsyncTask<Void, Void, Void>
{
  public static boolean status=false;
    @Override
    protected Void doInBackground(Void... params) {

       status=TwitterUtils.isAuthenticated(prefs);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //updateLoginStatus();
        loginStatus.setText("Logged into Twitter : " + status);
    }

}
于 2013-01-10T09:53:01.963 回答
0
Note that this method blocks waiting for a network response, so do not call it in a UI thread.

这是使用时的建议:

facebook.request("me");

同样的情况可能是:

twitter.getAccountSettings();

因此,就像您使用 AsyncTasks 调用的其他网络连接一样,在某些 AsyncTask 中调用它。

好的,错误可能在这里:

@Override
    protected void onPostExecute(Void result) {

        // TODO Auto-generated method stub
        super.onPostExecute(result);
        //updateLoginStatus();
        loginStatus.setText("Logged into Twitter : " + TwitterUtils.isAuthenticated(prefs));
    }

你在TwitterUtils.isAuthenticated(prefs)打电话onPostExecute();

于 2013-01-10T09:46:41.910 回答
0

您对 isAuthenticated() 的第一次调用已正确放置在 AsyncTask 中。但是,当您使用:

loginStatus.setText("Logged into Twitter : " + TwitterUtils.isAuthenticated(prefs));

在您的 onPostExecute() 中,您再次在 UI 线程上调用网络方法,因为 onPostExecute() 在 UI 线程上运行。

删除此行,或将结果存储在本地doInBackground()并在此处使用。

于 2013-01-10T09:49:32.803 回答