android twitter登录Looper.prepair
我正在使用TwitterAPI从包含web视图组件的对话框登录到我的android应用程序 此错误来自Logcat “无法在没有Looper.prepare()的线程内创建处理程序” 这个错误的解决方案是什么? 这是OAuthRequestTokenTask.java类的代码android twitter登录Looper.prepair,android,twitter,Android,Twitter,我正在使用TwitterAPI从包含web视图组件的对话框登录到我的android应用程序 此错误来自Logcat “无法在没有Looper.prepare()的线程内创建处理程序” 这个错误的解决方案是什么? 这是OAuthRequestTokenTask.java类的代码 import com.noqwerty.m.LoginActivity; import oauth.signpost.OAuthConsumer; import oauth.signpost.OAuthProvider;
import com.noqwerty.m.LoginActivity;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Looper;
import android.util.Log;
public class OAuthRequestTokenTask extends AsyncTask<Void, Void, Void> {
final String TAG = getClass().getName();
private Context context;
private OAuthProvider provider;
private OAuthConsumer consumer;
public OAuthRequestTokenTask(Context context, OAuthConsumer consumer,
OAuthProvider provider) {
this.context = context;
this.consumer = consumer;
this.provider = provider;
}
@Override
protected Void doInBackground(Void... params) {
try {
Log.i(TAG, "Retrieving request token from Google servers");
final String url = provider.retrieveRequestToken(consumer,
Constants.OAUTH_CALLBACK_URL);
Log.i(TAG, "Popping a browser with the authorize URL : " + url);
// Intent intent = new Intent(Intent.ACtuTION_VIEW,
// Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP |
// Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND);
// context.startActivity(intent);
// Looper.prepare();
LoginActivity.twd.setUpWebView(url);
} catch (Exception e) {
Log.e(TAG, "Error during OAUth retrieve request token", e);
}
return null;
}
}
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import oauth.signpost.http.HttpParameters;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.ViewGroup;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
public class TwitterDialog extends Dialog {
static final float[] DIMENSIONS_LANDSCAPE = { 460, 260 };
static final float[] DIMENSIONS_PORTRAIT = { 280, 420 };
static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);
static final int MARGIN = 4;
static final int PADDING = 2;
private ProgressDialog mSpinner;
private WebView mWebView;
private LinearLayout mContent;
private TextView mTitle;
private boolean progressDialogRunning = false;
final String TAG = getClass().getName();
private OAuthConsumer consumer;
private OAuthProvider provider;
HttpParameters params1;
public TwitterDialog(Context context) {
super(context);
try {
this.consumer = new CommonsHttpOAuthConsumer(
Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
this.provider = new CommonsHttpOAuthProvider(Constants.REQUEST_URL,
Constants.ACCESS_URL, Constants.AUTHORIZE_URL);
} catch (Exception e) {
Log.e(TAG, "Error creating consumer / provider", e);
}
Log.i(TAG, "Starting task to retrieve request token.");
new OAuthRequestTokenTask(this.getContext(), consumer, provider)
.execute();
}
// @Override
// protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
// try {
// this.consumer = new CommonsHttpOAuthConsumer(
// Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);
// this.provider = new CommonsHttpOAuthProvider(Constants.REQUEST_URL,
// Constants.ACCESS_URL, Constants.AUTHORIZE_URL);
// } catch (Exception e) {
// Log.e(TAG, "Error creating consumer / provider", e);
// }
//
// Log.i(TAG, "Starting task to retrieve request token.");
// new OAuthRequestTokenTask(this.getContext(), consumer, provider).execute();
//
// }
private void setUpTitle() {
requestWindowFeature(Window.FEATURE_NO_TITLE);
mTitle = new TextView(getContext());
mTitle.setText("Twitter");
mTitle.setTextColor(Color.WHITE);
mTitle.setTypeface(Typeface.DEFAULT_BOLD);
mTitle.setBackgroundColor(0xFFbbd7e9);
mTitle.setPadding(MARGIN + PADDING, MARGIN, MARGIN, MARGIN);
mTitle.setCompoundDrawablePadding(MARGIN + PADDING);
mContent.addView(mTitle);
}
public void setUpWebView(String u) {
mWebView = new WebView(getContext());
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.loadUrl(u);
mWebView.setWebViewClient(new TwitterWebViewClient());
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setLayoutParams(FILL);
mContent.addView(mWebView);
}
private class TwitterWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
/// mListener.onError(description);
TwitterDialog.this.dismiss();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mSpinner.show();
progressDialogRunning = true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
String title = mWebView.getTitle();
if (title != null && title.length() > 0) {
mTitle.setText(title);
}
progressDialogRunning = false;
mSpinner.dismiss();
}
}
@Override
protected void onStop() {
progressDialogRunning = false;
super.onStop();
}
public void onBackPressed() {
if(!progressDialogRunning){
TwitterDialog.this.dismiss();
}
}
}
Logcat输出
05-02 12:47:17.517: E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703): Error during OAUth retrieve request token
05-02 12:47:17.517: E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
05-02 12:47:17.517: E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703): at android.os.Handler.<init>(Handler.java:197)
05-02 12:47:17.517: E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703): at android.os.Handler.<init>(Handler.java:111)
05-02 12:47:17.517: E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703): at android.webkit.WebViewClassic$PrivateHandler.<init>(WebViewClassic.java:7242)
05-02 12:47:17.517:E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703):OAUth检索请求令牌时出错
05-02 12:47:17.517:E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
05-02 12:47:17.517:E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703):位于android.os.Handler.(Handler.java:197)
05-02 12:47:17.517:E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703):位于android.os.Handler.(Handler.java:111)
05-02 12:47:17.517:E/com.noqwerty.m.twitter.OAuthRequestTokenTask(1703):位于android.webkit.WebViewClassic$privateMhandler。(WebViewClassic.java:7242)
似乎您的一些方法试图从后台访问UI
线程并失败。将UI逻辑移动到要处理的onPostExecute
在UI线程上
请给出您的logcat错误日志,十分钟前也有人问过同样的问题。例外基本上说明了一切。查看它命名的类的文档可以告诉您需要知道的一切。@skyblueandroid007我已经编辑了它并添加了logcat