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

onPostExecute は常に UI スレッドで実行され、例外が発生しているため、現在呼び出しTwitterUtils.isAuthenticated(prefs)中です。onPostExecutenetworkonmainthreadexception

この問題を回避するには、 a を使用しBoolean 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 に答える
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 に答える
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() では、onPostExecute() が UI スレッドで実行されるため、UI スレッドでネットワーク メソッドを再度呼び出しています。

この行を削除するか、結果をローカルに保存しdoInBackground()てここで使用します。

于 2013-01-10T09:49:32.803 に答える