java - 尝试异步连接到 Twitter 时 Activity 关闭

标签 java android twitter4j

我一直在尝试为 Android 编写一个 twitter 客户端(使用 twitter4j)。到目前为止,我们的想法是拥有一个简单的 GUI,如果 SD 卡中没有包含 OAuth token 的文件,则使用 AsyncTask 连接到 Twitter API,获取授权的 URL 并打开默认浏览器。但是,浏览器永远不会运行。根据我尝试修复此问题所做的不同修改, Activity 要么正常启动,但浏览器从未启动,要么 Activity 崩溃。我已经到了有点沮丧和困惑的地步。有人能指出我的代码有什么问题吗?

public class StatusActivity extends Activity {

private static final String TAG = "StatusActivity";
EditText editText;
Button updateButton;
File oauthfile = null;
public Context context = getApplicationContext();

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

    Log.d(TAG, "started");
    // Find views
    editText = (EditText) findViewById(R.id.editText); //
    updateButton = (Button) findViewById(R.id.buttonUpdate);

    oauthfile = new File("sdcard/auth_file.txt");

    //Check if the file with the keys exist
    if (oauthfile.exists()==false){
        Log.d(TAG, "file not created");
        Context context = getApplicationContext();
        Toast toast = Toast.makeText(context, "file not created.",    Toast.LENGTH_SHORT);
        toast.show();
        new Authorization(context).execute();

    }


}

public void openBrowser (View v){
    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
    startActivity(browserIntent);
    Log.d(TAG, "onclick");
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.status, menu);
    return true;
    }
}

class Authorization extends AsyncTask <String, Integer, String>{
String url = null;
private Context context;

 Authorization(Context context) {
        this.context = context.getApplicationContext();
    }



public void onPreExecute() {
       super.onPreExecute();
       Toast.makeText(context, "Invoke onPreExecute()", Toast.LENGTH_SHORT).show();         
      }


@Override
public String doInBackground(String... params) {
    ConfigurationBuilder configBuilder = new ConfigurationBuilder();
    configBuilder.setDebugEnabled(true)
//I have eliminated the keys from the question :)
    .setOAuthConsumerKey("XXXXXXXXXXXXXX")
    .setOAuthConsumerSecret("XXXXXXXXXXXXXXX");
    Twitter OAuthTwitter = new TwitterFactory(configBuilder.build()).getInstance();
    RequestToken requestToken = null;
    AccessToken accessToken = null;     
    do{
        try {
            requestToken = OAuthTwitter.getOAuthRequestToken();
            url = requestToken.getAuthorizationURL();
        } 
        catch (TwitterException ex) {
            ex.printStackTrace();
        }       
    }
    while (accessToken==null);
    return url;
}

protected void onPostExecute(String result) {
    super.onPostExecute(result);

    Toast.makeText(context, "Opening browser.", Toast.LENGTH_SHORT).show();

    Intent browserIntent = new Intent(Intent.ACTION_ALL_APPS, Uri.parse(url));
    context.startActivity(browserIntent);
}
}

我知道至少会检查 token 文件是否存在,因为出现了“文件未创建”消息,并且如果我按下按钮,该 Activity 就能够运行浏览器。该应用程序具有写入 SD 卡和使用互联网的权限。提前致谢。

Logcat 跟踪:

03-28 19:02:32.816: E/AndroidRuntime(278): FATAL EXCEPTION: main
03-28 19:02:32.816: E/AndroidRuntime(278): java.lang.RuntimeException: Unable to     instantiate activity     ComponentInfo{com.versec.pardinus/com.versec.pardinus.StatusActivity}: java.lang.NullPointerException
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.os.Looper.loop(Looper.java:123)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.main(ActivityThread.java:4627)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.reflect.Method.invokeNative(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.reflect.Method.invoke(Method.java:521)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-28 19:02:32.816: E/AndroidRuntime(278):  at dalvik.system.NativeStart.main(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278): Caused by: java.lang.NullPointerException
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.content.ContextWrapper.getApplicationContext(ContextWrapper.java:100)
03-28 19:02:32.816: E/AndroidRuntime(278):  at com.versec.pardinus.StatusActivity.<init>(StatusActivity.java:30)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.Class.newInstanceImpl(Native Method)
03-28 19:02:32.816: E/AndroidRuntime(278):  at java.lang.Class.newInstance(Class.java:1429)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
03-28 19:02:32.816: E/AndroidRuntime(278):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
03-28 19:02:32.816: E/AndroidRuntime(278):  ... 11 more

最佳答案

这就是导致您崩溃的原因。

public Context context = getApplicationContext();

您甚至在需要时都没有使用它,因此您可以删除此行。

顺便说一句,我在查看您的代码时注意到的其他事情是:

oauthfile = new File("sdcard/auth_file.txt");

不要认为“sdcard/”路径是理所当然的。改用这个:

    File dir = Environment.getExternalStorageDirectory();
    File oauthfile = new File(dir, "auth_file.txt");

关于java - 尝试异步连接到 Twitter 时 Activity 关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15689080/

相关文章:

java - 使用带有选择器的 android slidermenu lib

java - 如何创建振幅上下限的正弦波

android - 在哪里下载opencv-2.4.6.1-android-arm.jar和ffmpeg-2.0.1-android-arm.jar

android - 将 Xcode 键绑定(bind)导入 IntelliJ IDEA

android - 如何估计两个安卓设备之间的距离? (蓝牙首选)

java - 从关键字获取推文

java - 从 json 推文中获取 json 用户

java - 无法在 Spring 引导中更新文档。在 mongorepository.save 上获取 E11000 重复键错误

java - Hibernate 不保存对象,即使在日志中没有收到任何错误

java - angularjs 和 Java 中的 Twitter 登录集成