Авторизация с помощью jTwitter android

Я новичок в твиттере API и асинхронных задачах. Я пробовал OAuth, используя jTwitter, который кажется простым API. Поскольку вы не можете выполнять сетевые операции в основном потоке. Я создал асинтаск для работы. Он бросает мне исключения, которые я не понимаю. Пожалуйста, помогите мне решить исключения.

Вот код

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)

person dnivra    schedule 17.02.2013    source источник


Ответы (1)


Метод doInBackground() не предназначен для выполнения каких-либо задач пользовательского интерфейса. Вы должны использовать onPostExecute() для этого. Если вам нужно показать Toast в doInBackground(), поместите его в 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);
person Siddharth Lele    schedule 17.02.2013
comment
как вы сказали, я удалил тост из doInBackground(). Все еще получаю исключения. что-то, связанное с началом деятельности извне. Отредактировали и добавили новые исключения. - person dnivra; 17.02.2013
comment
Разве сообщение об ошибке не говорит само за себя? Я до сих пор не понимаю смысла использовать AsyncTask для запуска кода, которым вы являетесь. Вы не выполняете ресурсоемкую задачу, вызывая startActivity() для намерения. Просто поместите его в postBtn.setOnClickListener. - person Siddharth Lele; 17.02.2013