2012-11-22 5 views
-1

주요 문제는 "주 활동이 응답하지 않습니다."입니다. 에뮬레이터를 실행하면 주 활동이 응답하지 않고 강제 종료됩니다. 지난 3 년 동안이 프로젝트에 착수했습니다. 며칠 동안 프로젝트가 트위터에 관한 것입니다. "주요 활동"에서 트위터 소비자 키와 비밀을 전달하고 있습니다. The source code 코드의 문제점을 설명 할 수있는 사람은 누구나 될 수 있습니다. 이것은 첫 번째 프로젝트입니다.활동 주 활동이 응답하지 않습니다

 package com.androidhive.twitterconnect 

    public class MainActivity extends Activity { 
// Constants 
/** 
* Register your here apps https://dev.twitter.com/apps/new and get your 
* consumer key and secret 
* */ 
static String TWITTER_CONSUMER_KEY = "consumer key"; 
static String TWITTER_CONSUMER_SECRET = " consumer secret"; 

// Preference Constants 
static String PREFERENCE_NAME = "twitter_oauth"; 
static final String PREF_KEY_OAUTH_TOKEN = "oauth_token"; 
static final String PREF_KEY_OAUTH_SECRET = "oauth_token_secret"; 
static final String PREF_KEY_TWITTER_LOGIN = "isTwitterLogedIn"; 

static final String TWITTER_CALLBACK_URL = "oauth://t4jsample"; 

// Twitter oauth urls 
static final String URL_TWITTER_AUTH = "auth_url"; 
static final String URL_TWITTER_OAUTH_VERIFIER = "oauth_verifier"; 
static final String URL_TWITTER_OAUTH_TOKEN = "oauth_token"; 

// Login button 
Button btnLoginTwitter; 
// Update status button 
Button btnUpdateStatus; 
// Logout button 
Button btnLogoutTwitter; 
// EditText for update 
EditText txtUpdate; 
// lbl update 
TextView lblUpdate; 
TextView lblUserName; 

// Progress dialog 
ProgressDialog pDialog; 

// Twitter 
private static Twitter twitter; 
private static RequestToken requestToken; 

// Shared Preferences 
private static SharedPreferences mSharedPreferences; 

// Internet Connection detector 
private ConnectionDetector cd; 

// Alert Dialog Manager 
AlertDialogManager alert = new AlertDialogManager(); 


public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

    cd = new ConnectionDetector(getApplicationContext()); 

    // Check if Internet present 
    if (!cd.isConnectingToInternet()) { 
     // Internet Connection is not present 
     alert.showAlertDialog(MainActivity.this, "Internet connection error", "please connect to working internet connection", false); 


     // stop executing code by return 
     return; 
    } 

    // Check if twitter keys are set 
    if(TWITTER_CONSUMER_KEY.trim().length() == 0 || TWITTER_CONSUMER_SECRET.trim().length() == 0){ 
     // Internet Connection is not present 
     alert.showAlertDialog 
     (MainActivity.this, "Twitter oAuth tokens", "Please set your twitter oauth tokens first!", false); 
     // stop executing code by return 
     return; 
    } 

    // All UI elements 

    btnLoginTwitter = (Button) findViewById(R.id.btnLoginTwitter); 
    btnUpdateStatus = (Button) findViewById(R.id.btnUpdateStatus); 
    btnLogoutTwitter = (Button) findViewById(R.id.btnLogoutTwitter); 
    txtUpdate = (EditText) findViewById(R.id.txtUpdateStatus); 
    lblUpdate = (TextView) findViewById(R.id.lblUpdate); 
    lblUserName = (TextView) findViewById(R.id.lblUserName); 

    // Shared Preferences 
    mSharedPreferences = getApplicationContext().getSharedPreferences(
      "MyPref", 0); 

    /** 
    * Twitter login button click event will call loginToTwitter() function 
    * */ 
    btnLoginTwitter.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // Call login twitter function 
      loginToTwitter(); 
     } 
    }); 

    /** 
    * Button click event to Update Status, will call updateTwitterStatus() 
    * function 
    * */ 
    btnUpdateStatus.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // Call update status function 
      // Get the status from EditText 
      String status = txtUpdate.getText().toString(); 

      // Check for blank text 
      if (status.trim().length() > 0) { 
       // update status 
       new updateTwitterStatus().execute(status); 
      } else { 
       // EditText is empty 
       Toast.makeText(getApplicationContext(), 
         "Please enter status message", Toast.LENGTH_SHORT) 
         .show(); 
      } 
     } 
    }); 

    /** 
    * Button click event for logout from twitter 
    * */ 
    btnLogoutTwitter.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // Call logout twitter function 
      logoutFromTwitter(); 
     } 
    }); 

    /** This if conditions is tested once is 
    * redirected from twitter page. Parse the uri to get oAuth 
    * Verifier 
    * */ 
    if (!isTwitterLoggedInAlready()) { 
     Uri uri = getIntent().getData(); 
     if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) { 
      // oAuth verifier 
      String verifier = uri 
        .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); 

      try { 
       // Get the access token 
       AccessToken accessToken = twitter.getOAuthAccessToken(
         requestToken, verifier); 

       // Shared Preferences 
       Editor e = mSharedPreferences.edit(); 

       // After getting access token, access token secret 
       // store them in application preferences 
       e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); 
       e.putString(PREF_KEY_OAUTH_SECRET, 
         accessToken.getTokenSecret()); 
       // Store login status - true 
       e.putBoolean(PREF_KEY_TWITTER_LOGIN, true); 
       e.commit(); // save changes 

       Log.e("Twitter OAuth Token", "> " + accessToken.getToken()); 

       // Hide login button 
       btnLoginTwitter.setVisibility(View.GONE); 

       // Show Update Twitter 
       lblUpdate.setVisibility(View.VISIBLE); 
       txtUpdate.setVisibility(View.VISIBLE); 
       btnUpdateStatus.setVisibility(View.VISIBLE); 
       btnLogoutTwitter.setVisibility(View.VISIBLE); 

       // Getting user details from twitter 
       // For now i am getting his name only 
       long userID = accessToken.getUserId(); 
       User user = twitter.showUser(userID); 
       String username = user.getName(); 

       // Displaying in xml ui 
       lblUserName.setText(Html.fromHtml("<b>Welcome " + username + "</b>")); 
      } catch (Exception e) { 
       // Check log for login errors 
       Log.e("Twitter Login Error", "> " + e.getMessage()); 
      } 
      } 
    } 

} 

/** 
* Function to login twitter 
* */ 
private void loginToTwitter() { 
    // Check if already logged in 
    if (!isTwitterLoggedInAlready()) { 
     ConfigurationBuilder builder = new ConfigurationBuilder(); 
     builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); 
     builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); 
     Configuration configuration = builder.build(); 

     TwitterFactory factory = new TwitterFactory(configuration); 
     twitter = factory.getInstance(); 

     try { 
      requestToken = twitter 
        .getOAuthRequestToken(TWITTER_CALLBACK_URL); 
      this.startActivity(new Intent(Intent.ACTION_VIEW, Uri 
        .parse(requestToken.getAuthenticationURL()))); 
     } catch (TwitterException e) { 
      e.printStackTrace(); 
     } 
    } else { 
     // user already logged into twitter 
     Toast.makeText(getApplicationContext(), 
       "Already Logged into twitter", Toast.LENGTH_LONG).show(); 
    } 
} 

/** 
* Function to update status 
* */ 
class updateTwitterStatus extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage("Updating to twitter..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    /** 
    * getting Places JSON 
    * */ 
    protected String doInBackground(String args[]) { 
     Log.d("Tweet Text", "> " + args[0]); 
     String status = args[0]; 
     try { 
      ConfigurationBuilder builder = new ConfigurationBuilder(); 
      builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY); 
      builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); 

      // Access Token 
      String access_token = mSharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, ""); 
      // Access Token Secret 
      String access_token_secret = mSharedPreferences.getString(PREF_KEY_OAUTH_SECRET, ""); 

      AccessToken accessToken = new AccessToken(access_token, access_token_secret); 
      Twitter twitter = new TwitterFactory(builder.build()).getInstance(accessToken); 

      // Update status 
      twitter4j.Status response = twitter.updateStatus(status); 

      Log.d("Status", "> " + response.getText()); 
     } catch (TwitterException e) { 
      // Error in updating status 
      Log.d("Twitter Update Error", e.getMessage()); 
     } 
     return null; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog and show 
    * the data in UI Always use runOnUiThread(new Runnable()) to update UI 
    * from background thread, otherwise you will get error 
    * **/ 
    protected void onPostExecute(String file_url) { 
     // dismiss the dialog after getting all products 
     pDialog.dismiss(); 
     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       Toast.makeText(getApplicationContext(), 
         "Status tweeted successfully", Toast.LENGTH_SHORT) 
         .show(); 
       // Clearing EditText field 
       txtUpdate.setText(""); 
      } 
     }); 
    } 

} 

/** 
* Function to logout from twitter 
* It will just clear the application shared preferences 
* */ 
private void logoutFromTwitter() { 
    // Clear the shared preferences 
    Editor e = mSharedPreferences.edit(); 
    e.remove(PREF_KEY_OAUTH_TOKEN); 
    e.remove(PREF_KEY_OAUTH_SECRET); 
    e.remove(PREF_KEY_TWITTER_LOGIN); 
    e.commit(); 

    // After this take the appropriate action 
    // I am showing the hiding/showing buttons again 
    // You might not needed this code 
    btnLogoutTwitter.setVisibility(View.GONE); 
    btnUpdateStatus.setVisibility(View.GONE); 
    txtUpdate.setVisibility(View.GONE); 
    lblUpdate.setVisibility(View.GONE); 
    lblUserName.setText(""); 
    lblUserName.setVisibility(View.GONE); 

    btnLoginTwitter.setVisibility(View.VISIBLE); 
} 

/** 
* Check user already logged in your application using twitter Login flag is 
* fetched from Shared Preferences 
* */ 
private boolean isTwitterLoggedInAlready() { 
    // return twitter login status from Shared Preferences 
    return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false); 
} 

protected void onResume() { 
    super.onResume(); 
} 

}

+0

매니페스트를 변경 했습니까? –

+1

여기에 로그를 게시하십시오. –

+0

내 매니 페스트 파일에 UI 스레드 – fiddler

답변

0

다음과 같이

<activity 
      android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
+0

에 대한 긴 네트워크 작업을 수행 중입니다. – vinya

0

가 매니페스트에 UR 활동을 추가 매니페스트 파일에 활동을 추가

 <activity 
     android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

또한 mainActivity의 BTN의 컴포넌트를 등록하려고합니다. SetOnClicklistener() :

관련 문제