Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中集成twitter API时获取NetworkOnMainThreadException_Android_Android Asynctask_Android Twitter - Fatal编程技术网

在android中集成twitter API时获取NetworkOnMainThreadException

在android中集成twitter API时获取NetworkOnMainThreadException,android,android-asynctask,android-twitter,Android,Android Asynctask,Android Twitter,我在这方面搜索了很多,但没有找到解决办法。我正在尝试将twitter集成到我的Android应用程序中。它在emulator上运行良好,但在蜂窝和更高级别的设备上运行不佳。下面,我附上了带有代码的日志cat错误 01-14 11:56:31.226: W/System.err(3649): android.os.NetworkOnMainThreadException 01-14 11:56:31.230: W/System.err(3649): at android.os.Strict

我在这方面搜索了很多,但没有找到解决办法。我正在尝试将twitter集成到我的Android应用程序中。它在emulator上运行良好,但在蜂窝和更高级别的设备上运行不佳。下面,我附上了带有代码的日志cat错误

01-14 11:56:31.226: W/System.err(3649): android.os.NetworkOnMainThreadException
01-14 11:56:31.230: W/System.err(3649):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
01-14 11:56:31.230: W/System.err(3649):     at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
01-14 11:56:31.230: W/System.err(3649):     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
01-14 11:56:31.230: W/System.err(3649):     at java.net.InetAddress.getAllByName(InetAddress.java:220)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
01-14 11:56:31.230: W/System.err(3649):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
01-14 11:56:31.234: W/System.err(3649):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
01-14 11:56:31.234: W/System.err(3649):     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273)
01-14 11:56:31.234: W/System.err(3649):     at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:479)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpResponseImpl.<init>(HttpResponseImpl.java:45)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:178)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:75)
01-14 11:56:31.234: W/System.err(3649):     at twitter4j.internal.http.HttpClientWrapper.get(HttpClientWrapper.java:103)
01-14 11:56:31.238: W/System.err(3649):     at twitter4j.Twitter.getAccountSettings(Twitter.java:1440)
01-14 11:56:31.238: W/System.err(3649):     at com.recipe.pack.TwitterUtils.isAuthenticated(TwitterUtils.java:23)
01-14 11:56:31.238: W/System.err(3649):     at com.recipe.pack.RecpieActivity.onClick(RecpieActivity.java:763)
01-14 11:56:31.238: W/System.err(3649):     at android.view.View.performClick(View.java:3511)
01-14 11:56:31.238: W/System.err(3649):     at android.view.View$PerformClick.run(View.java:14105)
01-14 11:56:31.238: W/System.err(3649):     at android.os.Handler.handleCallback(Handler.java:605)
01-14 11:56:31.238: W/System.err(3649):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-14 11:56:31.238: W/System.err(3649):     at android.os.Looper.loop(Looper.java:137)
01-14 11:56:31.242: W/System.err(3649):     at android.app.ActivityThread.main(ActivityThread.java:4424)
01-14 11:56:31.242: W/System.err(3649):     at java.lang.reflect.Method.invokeNative(Native Method)
01-14 11:56:31.242: W/System.err(3649):     at java.lang.reflect.Method.invoke(Method.java:511)
01-14 11:56:31.242: W/System.err(3649):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-14 11:56:31.242: W/System.err(3649):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-14 11:56:31.246: W/System.err(3649):     at dalvik.system.NativeStart.main(Native Method)
实现按钮的类:

case R.id.btweet:
            Toast.makeText(this, "Recipe Tweet will be posted on your profile", 5000).show();
            try{
            if (TwitterUtils.isAuthenticated(prefs)) {
                sendTweet();
            } else {
                Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class);
                i.putExtra("tweet_msg",getTweetMsg());
                startActivity(i);
            }
            }catch(Exception e){
                e.printStackTrace();
            }
            break;

您不能在主线程上使用网络操作,您必须实现一个
AsyncTask
,它在其
doInBackground
方法上执行网络操作

在按钮上尝试以下操作:

Toast.makeText(this, "Recipe Tweet will be posted on your profile", 5000).show();
            try{
            if (TwitterUtils.isAuthenticated(prefs)) {
                new AsyncTask<Void,Void,Void>(){

                    protected Void doInBackground(Void... args){
                        sendTweet();
                        return null;
                    }

                }.execute();
            } else {
                Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class);
                i.putExtra("tweet_msg",getTweetMsg());
                startActivity(i);
            }
            }catch(Exception e){
                e.printStackTrace();
            }
            break;
Toast.makeText(此“配方推文将发布在您的个人资料上”,5000)。show();
试一试{
如果(TwitterUtils.isAuthenticated(prefs)){
新建异步任务(){
受保护的Void doInBackground(Void…args){
sendTweet();
返回null;
}
}.execute();
}否则{
Intent i=新Intent(getApplicationContext(),PrepareRequestTokenActivity.class);
i、 putExtra(“tweet_msg”,getTweetMsg());
星触觉(i);
}
}捕获(例外e){
e、 printStackTrace();
}
打破
试试这个:

替换此代码:

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
                    sendTweet();
            }
            else {
                // Do processing after authentication failure
                    Intent i = new Intent(getApplicationContext(), PrepareRequestTokenActivity.class);
                    i.putExtra("tweet_msg",getTweetMsg());
                    startActivity(i);
            }
        }
    }.execute(prefs);
newasynctask(){
@凌驾
受保护的布尔doInBackground(SharedReferences…参数){
返回TwitterUtils.isAuthenticated(参数[0]);
}
@凌驾
受保护的void onPostExecute(布尔值已验证){
如果(未经验证){
//验证成功后执行处理
sendTweet();
}
否则{
//在身份验证失败后执行处理
Intent i=新Intent(getApplicationContext(),PrepareRequestTokenActivity.class);
i、 putExtra(“tweet_msg”,getTweetMsg());
星触觉(i);
}
}
}.执行(prefs);

在oncreate中写下这些行和,它不会给你例外

//-----------------Checking thread policy
    int SDK_INT = android.os.Build.VERSION.SDK_INT;
    if (SDK_INT >= 10) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }          

当应用程序尝试在其主线程上执行网络操作时,会引发此异常。在AsyncTask中运行代码。更多信息:另外,不要使用5000作为吐司长度。它不是这样工作的:您必须传递Toast.LENGTH\u SHORT或Toast.LENGTH\u LONG。另外,不要使用getApplicationContext()作为意图上下文。相反,请使用ActivityName.this。如果要在主线程上执行任何操作(UI操作),可以通过在AsyncTask中重写onPreExecute和onPostExecute来执行这些操作。onPreExecute将在doInBackground之前调用。onPostExecute将在doInBackground之后调用。使用AsyncTask包装每个网络调用。我不知道哪些方法实际上是网络调用。使用Eclipse调试器查找从何处获取异常,然后将其包装到AsyncTask中。我的代码中不再有任何网络调用。我是否需要在TwitterUtils.java类中执行任何更改。我很高兴为解决您的问题提供了巨大的帮助,您可以为此给我一个投票奖励吗?例外情况是有充分理由的。在UI线程上执行网络操作是一个坏主意,您应该得到一个异常通知。不要隐藏你的编程错误!关于避免例外的说法这永远不应该被建议作为一种解决方案。框架试图警告您不要这样做,而禁止这样做毫无用处。
//-----------------Checking thread policy
    int SDK_INT = android.os.Build.VERSION.SDK_INT;
    if (SDK_INT >= 10) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
    }