尝试异步连接到twitter时,活动关闭

时间:2013-03-28 18:05:30

标签: java android twitter4j

我一直在尝试为Android安装Twitter客户端(使用twitter4j)。到目前为止,我们的想法是拥有一个简单的GUI,如果SD卡中没有带OAuth令牌的文件,请使用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);
}
}

我知道至少会检查令牌的文件是否存在,因为出现了toast“file not created”,并且如果按下按钮,活动就能够运行浏览器。该应用程序有权写入SD卡并使用Internet。提前谢谢。

Logcat Trace:

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

1 个答案:

答案 0 :(得分:1)

这是导致您崩溃的原因。

public Context context = getApplicationContext();

你甚至不需要它时使用它,所以你可以摆脱这条线。

顺便说一下,在看到你的代码时我注意到的是:

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

不要将“sdcard /”路径视为理所当然。请改用:

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