9

私は1つのアプリケーションを開発しました.今、私は自分のアプリケーションにtwitterを統合しようとしています.私の問題は、アプリケーションにログインするとき"android.os.NetworkOnMainThreadException"ですandroid.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)".

どなたか助けてください よろしくお願いします...

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.RequestToken;
import twitter4j.conf.ConfigurationBuilder;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class TwitterActivity extends Activity {
    static final String CONSUMER_KEY="my consumer key";
    static final String CONSUMER_SECRETKEY="my secret key";
    Button buttonLoginTwitter;
    SharedPreferences sharedpref;
    Twitter twitter;
    private static RequestToken requestToken;
    static final String TWITTER_CALLBACK_URL = "oauth://t4jsample";
    static final String ISTWITTERLOGIN="isTwitterLogedIn";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_twitter);
        buttonLoginTwitter=(Button)findViewById(R.id.btnidLogin);
        sharedpref=getApplicationContext().getSharedPreferences("mypreference", 0);
        TwitterLogin();
    }
    private void TwitterLogin() {
        buttonLoginTwitter.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                if(!istwitterLogin())
                {
                    ConfigurationBuilder builder = new ConfigurationBuilder();
                    builder.setOAuthConsumerKey(CONSUMER_KEY);
                    builder.setOAuthConsumerSecret(CONSUMER_SECRETKEY);
                    twitter4j.conf.Configuration configuration=builder.build();
                    TwitterFactory factory = new TwitterFactory(configuration);
                    twitter = factory.getInstance();

                        try {
                            requestToken = twitter
                                    .getOAuthRequestToken(TWITTER_CALLBACK_URL);
                            TwitterActivity.this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
                                    .parse(requestToken.getAuthenticationURL())));
                        } catch (TwitterException e) {
                            e.printStackTrace();
                        }
                }
                else {
                    Toast.makeText(getApplicationContext(),"Already Logged into twitter", Toast.LENGTH_LONG).show();
                }
            }
        });
    }
    protected boolean istwitterLogin() {
        return sharedpref.getBoolean(ISTWITTERLOGIN, false);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.twitter, menu);
        return true;
    }

}

ログインしようとすると、次のエラーが発生しました。

  E/AndroidRuntime( 5946): FATAL EXCEPTION: main
E/AndroidRuntime( 5946): android.os.NetworkOnMainThreadException
E/AndroidRuntime( 5946):    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
E/AndroidRuntime( 5946):    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
E/AndroidRuntime( 5946):    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
E/AndroidRuntime( 5946):    at java.net.InetAddress.getAllByName(InetAddress.java:214)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpEngine.connect(HttpEngine.java:310)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
E/AndroidRuntime( 5946):    at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
E/AndroidRuntime( 5946):    at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:158)
E/AndroidRuntime( 5946):    at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65)
E/AndroidRuntime( 5946):    at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102)
E/AndroidRuntime( 5946):    at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:121)
E/AndroidRuntime( 5946):    at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:104)
E/AndroidRuntime( 5946):    at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:276)
E/AndroidRuntime( 5946):    at com.androidhive.twitterconnect.MainActivity.loginToTwitter(MainActivity.java:236)
E/AndroidRuntime( 5946):    at com.androidhive.twitterconnect.MainActivity.access$1(MainActivity.java:223)
E/AndroidRuntime( 5946):    at com.androidhive.twitterconnect.MainActivity$1.onClick(MainActivity.java:123)
E/AndroidRuntime( 5946):    at android.view.View.performClick(View.java:4084)
E/AndroidRuntime( 5946):    at android.view.View$PerformClick.run(View.java:16966)
E/AndroidRuntime( 5946):    at android.os.Handler.handleCallback(Handler.java:615)
E/AndroidRuntime( 5946):    at android.os.Handler.dispatchMessage(Handler.java:92)
E/AndroidRuntime( 5946):    at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime( 5946):    at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime( 5946):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 5946):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime( 5946):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime( 5946):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime( 5946):    at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  282):   Force finishing activity com.androidhive.twitterconnect/.MainActivity
D/mobiled--->listener(   76): [Client side (recv_cnt: 3671)]: Data is coming, go to check fd_set.
D/mobiled--->listener(   76): [Client side (recv_cnt: 3671)]: Find a socket with data, unlock and receive.
D/mobiled--->netlink_listener(   76): Going to decode uevent.
4

4 に答える 4

11

このonCreate()メソッドを確認する必要があります。

if (android.os.Build.VERSION.SDK_INT > "YOur minimum SDK Version here") {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }

そして、マニフェストに許可を追加します..

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

アップデート

android.os.NetworkOnMainThreadExceptionブロックされるメインスレッドでネットワーク操作を実行していることを意味します。したがって、上記の解決策は、ネットワーク エラーを制限することです。ただし、このエラーを克服するには、AsyncTaskを使用するか、子スレッドを作成して、そのメソッドで UI を更新するrunOnUiThreadメソッドで UI を更新する必要があります。

于 2013-08-23T05:23:49.487 に答える
5

この例外は、アプリケーションがメイン スレッドでネットワーク操作を実行しようとするとスローされます。AsyncTask でコードを実行します。

class RetreiveFeedTask extends AsyncTask<String, Void, RSSFeed> {

    private Exception exception;

    protected RSSFeed doInBackground(String... urls) {
        try {
            URL url= new URL(urls[0]);
            SAXParserFactory factory =SAXParserFactory.newInstance();
            SAXParser parser=factory.newSAXParser();
            XMLReader xmlreader=parser.getXMLReader();
            RssHandler theRSSHandler=new RssHandler();
            xmlreader.setContentHandler(theRSSHandler);
            InputSource is=new InputSource(url.openStream());
            xmlreader.parse(is);
            return theRSSHandler.getFeed();
        } catch (Exception e) {
            this.exception = e;
            return null;
        }
    }

    protected void onPostExecute(RSSFeed feed) {
        // TODO: check this.exception 
        // TODO: do something with the feed
    }
}

タスクの実行方法:

new RetreiveFeedTask().execute(urlToRssFeed);

これを AndroidManifest.xml ファイルに追加することを忘れないでください:

<uses-permission android:name="android.permission.INTERNET"/>
于 2013-08-23T05:25:18.663 に答える
2

oncreate off アクティビティに次のコードを追加するだけです。

 if (android.os.Build.VERSION.SDK_INT > 8) {
      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
      StrictMode.setThreadPolicy(policy);
    }
于 2013-08-23T05:27:17.650 に答える
0

メインスレッドで接続を確立しています。メソッドTwitterLogin()のすべてのコードは、スレッドに記述するか、非同期タスクを開始する必要があります。

于 2013-08-23T05:26:44.547 に答える