2013-02-17 55 views
0

我是twitter api和異步任務的新手。我正在嘗試使用jTwitter的OAuth,這似乎是簡單的API。由於您無法在主線程上執行網絡操作。我爲這項工作創造了一個異想天開。這是拋出我不瞭解的例外。請幫我解決例外情況。jTwitter的授權android

下面是代碼

Twitter twitter = null; 
private EditText tweetTxt = null; 
private Button postBtn = null; 

private OAuthSignpostClient client = null; 
private String CALLBACK_URI = "myapp://twitt"; 

private String authUrl = null; 
private ProgressDialog postDialog = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    postBtn=(Button)findViewById(R.id.button1); 




    postBtn.setOnClickListener(new OnClickListener() { 

     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 

      new MyTask().execute(); 

     } 
    }); 


} 

private class MyTask extends AsyncTask<Void, Void, Void> { 


    protected void onPreExecute() { 
     Toast.makeText(getApplicationContext(), "pre execute", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     client = new OAuthSignpostClient("" ,"", CALLBACK_URI); 

     authUrl = client.authorizeUrl().toString(); 
     getApplicationContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 

    } 



} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

protected void onNewIntent(Intent intent) { 

    super.onNewIntent(intent); 
    Uri uri = intent.getData(); 
    //Check if you got NewIntent event due to Twitter Call back only 
    if (uri != null && uri.toString().startsWith(CALLBACK_URI)) 
    { 
    try 
    { 
    String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 
    client.setAuthorizationCode(verifier); 
    } 
    catch(Exception e){ 
    Log.d("exception", e.getMessage()); 
    } 
    }} 

和例外,我得到

02-17 10:58:54.751: E/AndroidRuntime(987): FATAL EXCEPTION: AsyncTask #1 
    02-17 10:58:54.751: E/AndroidRuntime(987): java.lang.RuntimeException: An error occured while executing doInBackground() 
    02-17 10:58:54.751: E/AndroidRuntime(987): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at java.lang.Thread.run(Thread.java:856) 
    02-17 10:58:54.751: E/AndroidRuntime(987): Caused by: android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 
    02-17 10:58:54.751: E/AndroidRuntime(987): at android.app.ContextImpl.startActivity(ContextImpl.java:886) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at android.app.ContextImpl.startActivity(ContextImpl.java:880) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at android.content.ContextWrapper.startActivity(ContextWrapper.java:276) 
    02-17 10:58:54.751: E/AndroidRuntime(987): at com.example.retrieve.contacts.twitter.MainActivity$MyTask.doInBackground(MainActivity.java:72) 

回答

0

doInBackground()方法並不意味着執行任何UI任務。你應該使用onPostExecute()。如果您需要在doInBackground()中顯示Toast,請將其放在Runnable()中,如代碼所示。

Runnable run = new Runnable() { 

    @Override 
    public void run() { 

     // SHOW A TOAST 
     Toast.makeText(getApplicationContext(), "background stuff", Toast.LENGTH_LONG).show();       
    } 
}; MainActivity.this.runOnUiThread(run); 
+0

正如你所說,我從doInBackground()中刪除了Toast。仍然有例外。與從外部開始活動有關的事情。已編輯並添加新的例外。 – dnivra 2013-02-17 05:35:12

+0

錯誤信息不是自解釋的嗎?我仍然不明白使用'AsyncTask'來運行你的代碼。通過調用Intent的'startActivity()',您不需要執行資源密集型任務。只要把它放在'postBtn.setOnClickListener'中。 – 2013-02-17 05:47:15

+0

問題已解決。非常感謝。 – dnivra 2013-02-17 05:53:38