2014-07-11 3 views
-1

그녀는 트위터에서 사용자 트윗을 retie하기위한 내 안드로이드 코드입니다. 나는 lowerapi 버전에서 이것을 성공적으로 수행했다. asynctask에서 동일한 작업을 수행하여 메인 스레드 예외에서 네트워크를 피할 수 있습니까? 내가 컴파일을 확인하지 않지만 이와 유사한네트워크 작업을 별도의 스레드에서 실행하여 3보다 큰 android api의 크래시를 피하십시오.

public class MainActivity extends ActionBarActivity { 

    public Bitmap placeholder; 
    Context mContext; 
    Twitter mTwitter; 
    ListView mListView; 

    static String TWITTER_CONSUMER_KEY = "GHGHGJHghghgjhggM"; 
    static String TWITTER_CONSUMER_SECRET = "jkhKJHjhkjhkHkjhHk38YQXUs"; 
    static String TWITTER_ACCESS_TOKEN = "343434343434-fAZAMIuwAAKlXgby2rXeyvAnhKJHJHJHjhjHJKHjhjhjhhhJ"; 
    static String TWITTER_TOKEN_SECRET = "JBKJkjhJHJJHHFDJBJbhjvghdgsxs"; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mListView = (ListView) findViewById(R.id.ListViewId); 
     mContext = getApplicationContext(); 
     mTwitter = getTwitter(); 

     ArrayList<Tweet> tweets = showTweetsAbout("IntelAndroid"); 

     ArrayAdapter<Tweet> adapter = new TweetItemAdapter(this, R.layout.listitem, tweets); 
     mListView.setAdapter(adapter); 
    } 


    private Twitter getTwitter() { 

     ConfigurationBuilder cb = new ConfigurationBuilder(); 
     cb.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); 
     cb.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); 
     cb.setOAuthAccessToken(TWITTER_ACCESS_TOKEN); 
     cb.setOAuthAccessTokenSecret(TWITTER_TOKEN_SECRET); 
     cb.setUseSSL(true); 
     //cb.setJSONStoreEnabled(true); 
     return new TwitterFactory(cb.build()).getInstance(); 
    } 

    private ArrayList<Tweet> showTweetsAbout(String queryString) { 

     ArrayList<Tweet> tweets = new ArrayList<Tweet>(); 
     List<Status> statuses = new ArrayList<Status>(); 

     try { 


     statuses = mTwitter.search(new Query(queryString)).getTweets(); 
     for (Status s : statuses) { 
      Tweet tweet = onStatus(s); 
      tweets.add(tweet); 
     } 

     } catch (TwitterException e) { 
      e.printStackTrace(); 
     } 

     return tweets; 

    } 
+4

사용하는 경우 기본 규칙을 점검합니다'네트워크 액세스 AsyncTask'는 onPostExecute''에서 주요 스레드에 아무것도를 업데이트 할 필요가 doInBackground''에 네트워크 액세스 모든 것을 아무것도 넣어하는 것입니다 . 주 스레드 구성 요소를 주기적으로 업데이트해야하는 경우'onProgressUpdate'와 함께'publishProgress'를 사용할 수도 있습니다. – Squonk

답변

0

이 나를 위해 놀랍도록 잘 작동.

public class MainActivity extends ActionBarActivity 
{ 

    public Bitmap placeholder; 
    Context mContext; 
    Twitter mTwitter; 
    ListView mListView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mListView = (ListView) findViewById(R.id.ListViewId); 
     mContext = getApplicationContext(); 
     mTwitter = getTwitter(); 

     new NetworkRetrieveTweets(this).execute((Void) null); 

    } 

    private Twitter getTwitter() { 

     ConfigurationBuilder cb = new ConfigurationBuilder(); 
     cb.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY); 
     cb.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET); 
     cb.setOAuthAccessToken(Constants.TWITTER_ACCESS_TOKEN); 
     cb.setOAuthAccessTokenSecret(Constants.TWITTER_TOKEN_SECRET); 
     cb.setUseSSL(true); 

     return new TwitterFactory(cb.build()).getInstance(); 
    } 

    private ArrayList<Tweet> showTweetsAbout(String queryString) { 

     ArrayList<Tweet> tweets = new ArrayList<Tweet>(); 
     List<Status> statuses = new ArrayList<Status>(); 

     try { 

      statuses = mTwitter.search(new Query(queryString)).getTweets(); 
      for (Status s : statuses) { 
       Tweet tweet = onStatus(s); 
       tweets.add(tweet); 
      } 

     } catch (TwitterException e) { 
      e.printStackTrace(); 
     } 

     return tweets; 

    } 

    public Tweet onStatus(Status status) { 

     User user = status.getUser(); 

     String image_url = user.getBiggerProfileImageURL(); 

     String username = user.getScreenName(); 

     String userLocation = user.getLocation(); 

     Date createdAt = status.getCreatedAt(); 

     long tweetId = status.getId(); 

     String message = status.getText(); 

     Tweet tweet = new Tweet(username, message, image_url, tweetId); 

     return tweet; 

    } 

    public class NetworkRetrieveTweets extends AsyncTaskEx<Void, Void, ArrayList<Tweet>> { 

     Context context; 
     ProgressDialog mDialog; 

     public NetworkRetrieveTweets(Context c) { 
      this.context = c; 

      mDialog = ProgressDialog.show(c, "", getString(R.string.loading), true, false); 
      mDialog.setCancelable(true); 
     } 

     @Override 
     public void onPreExecute() { 

      /** 
      * show dialog 
      */ 
      super.onPreExecute(); 

     } 


     @Override 
     protected ArrayList<Tweet> doInBackground(Void... params) { 

      /** 
      * Do network related stuff 
      * return string response. 
      */ 

      ArrayList<Tweet> tweets = showTweetsAbout("IntelAndroid"); 

      return tweets; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<Tweet> tweets) { 

      /** 
      * update ui thread and remove dialog 
      */ 
      super.onPostExecute(tweets); 

      conVenience(tweets); 

      if(mDialog.isShowing()) { 
       try { 
        mDialog.dismiss(); 
       } catch (Exception e) { //This occasionally fails 
        e.printStackTrace(); 
       } 
      } 

     } 
    } 

    public void conVenience(ArrayList<Tweet> tweets) { 
     ArrayAdapter<Tweet> adapter = new TweetItemAdapter(this, R.layout.listitem, tweets); 
     mListView.setAdapter(adapter); 
    } 

} 
0

뭔가 작동한다 : 거기에 비슷한 문제를 가진 사람들을위한

public class MainActivity extends ActionBarActivity 
{ 

    public Bitmap placeholder; 
    Context mContext; 
    Twitter mTwitter; 
    ListView mListView; 
    ArrayList<Tweet> mTweets; 
    ArrayAdapter<Tweet> mAdapter; 

    static String TWITTER_CONSUMER_KEY = "GHGHGJHghghgjhggM"; 
    static String TWITTER_CONSUMER_SECRET = "jkhKJHjhkjhkHkjhHk38YQXUs"; 
    static String TWITTER_ACCESS_TOKEN = "343434343434-fAZAMIuwAAKlXgby2rXeyvAnhKJHJHJHjhjHJKHjhjhjhhhJ"; 
    static String TWITTER_TOKEN_SECRET = "JBKJkjhJHJJHHFDJBJbhjvghdgsxs"; 


    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mListView = (ListView) findViewById(R.id.ListViewId); 
     mContext = getApplicationContext(); 
     mTwitter = getTwitter(); 

     showTweetsAbout("IntelAndroid"); 
    } 


    private Twitter getTwitter() 
    { 

     ConfigurationBuilder cb = new ConfigurationBuilder(); 
     cb.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); 
     cb.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); 
     cb.setOAuthAccessToken(TWITTER_ACCESS_TOKEN); 
     cb.setOAuthAccessTokenSecret(TWITTER_TOKEN_SECRET); 
     cb.setUseSSL(true); 
     //cb.setJSONStoreEnabled(true); 
     return new TwitterFactory(cb.build()).getInstance(); 
    } 

    private void showTweetsAbout(String queryString) 
    { 
     new AsyncTask<Void, Void, Void>() 
     { 
      List<Status> statuses = new ArrayList<Status>(); 

      @Override 
      protected Void doInBackground(Void... voids) 
      { 
       try 
       { 
        statuses = mTwitter.search(new Query(queryString)).getTweets(); 
        for (Status s : statuses) 
        { 
         Tweet tweet = onStatus(s); 
         mTweets.add(tweet); 
        } 
       } 
       catch (TwitterException e) 
       { 
        e.printStackTrace(); 
       } 

       return null; 
      } 

      @Override 
      protected void onPostExecute(Void aVoid) 
      { 
       super.onPostExecute(aVoid); 

       mAdapter = new TweetItemAdapter(this, R.layout.listitem, tweets); 
       mListView.setAdapter(adapter); 
      } 
     }.execute(); 
    } 
}