2013-01-10 45 views
1

我有以下2類如何在Android中處理networkonmainthreadexception?

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中運行,但我不知道如何做到這一點。

+1

有你'刪除loginStatus.setText(後試圖「登錄到Twitter的:」 + TwitterUtils。 isAuthenticated(prefs));'line? –

+0

不,我需要執行那條線。我知道這是點 – user1688181

+0

爲什麼你需要這條線? –

回答

1

當前您在onPostExecute中致電TwitterUtils.isAuthenticated(prefs),因爲onPostExecute總是在UI線程上執行,那麼您將得到networkonmainthreadexception異常。

以避免此問題使用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); 
    } 

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

您在onPostExecute();

+0

他從一個asynctask調用它。 –

+0

@RaghavSood是的。但是他也在'onPostExecute();' –

1

調用TwitterUtils.isAuthenticated(prefs)的問題是,你正在使用的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()); 
} 
+0

中調用它可以將布爾值更改爲受保護的Void doInBackground(Void ... params)的返回類型嗎?我不能這樣做。顯示錯誤 – user1688181

+0

我忘記了類簽名,請參閱我的編輯:class CallNetworkMethod extends AsyncTask ' – Budius

+0

其工作。謝謝 – user1688181

0

您對isAuthenticated()的第一次調用已正確放置在AsyncTask中。但是,當你使用:

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

在onPostExecute(),你調用在UI線程聯網方法再次,作爲onPostExecute()是在UI線程上運行。

刪除此行,或從doInBackground()本地存儲結果並在此處使用它。

相關問題