在相同的问题上待了太多个小时,所以我想出了为什么不问stackoverflow社区。
我已经实现了twitter,如果定向是纵向的,则可以正常工作。如果我在异步通话期间将手机置于横向,则会崩溃。我已经看到了一些有关此问题的示例,并尝试了其中的一些示例。锁定屏幕不是解决方案。
我将尝试发布一段代码。也许有人可以给我小费。谢谢
Logcat错误
12-03 16:43:01.650 18351-18351/com.example.admin.football E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.admin.football.fragments.TwitterFragment.onTaskFinished(TwitterFragment.java:94)
at com.example.admin.football.fragments.TwitterFragment$DownloadTwitterTask.onPostExecute(TwitterFragment.java:193)
at com.example.admin.football.fragments.TwitterFragment$DownloadTwitterTask.onPostExecute(TwitterFragment.java:171)
at android.os.AsyncTask.finish(AsyncTask.java:631)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4797)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
Java代码:
public TwitterFragment()
{
}
@Override
public void onTaskStarted() {
isTaskRunning = true;
load(listView);
}
// converts a string of JSON data into a Twitter object
private Twitter jsonToTwitter(String result) {
Twitter twits = null;
if (result != null && result.length() > 0) {
try {
Gson gson = new Gson();
twits = gson.fromJson(result, Twitter.class);
} catch (IllegalStateException ex) {
// just eat the exception
}
}
return twits;
}
@Override
public void onTaskFinished(String result) {
if (spinner != null) {
final Twitter twits = jsonToTwitter(result);
if(twits!=null) {
// lets write the results to the console as well
for (Tweet tweet : twits) {
Log.i(LOG_TAG, tweet.getText());
}
cardArrayAdapter = new CardArrayAdapter(getActivity().getApplicationContext(), R.layout.list_item_card);
for (int i = 0; i < twits.size(); i++) {
String dt = twits.get(i).getDateCreated();
Card card = new Card(twits.get(i).getUser().getProfileImageUrl(), twits.get(i).getUser().getScreenName(), twits.get(i).toString(), dt.substring(0, 10));
cardArrayAdapter.add(card);
}
listView.setAdapter(cardArrayAdapter);
/*cardArrayAdapter.getFilter().filter(Hashtag, new Filter.FilterListener() {
@Override
public void onFilterComplete(int count) {
listView.setAdapter(cardArrayAdapter);
}
});*/
spinner.setVisibility(View.GONE);
}
spinner.setVisibility(View.GONE);
}
isTaskRunning = false;
}
@Override
public void onDetach() {
// All dialogs should be closed before leaving the activity in order to avoid
// the: Activity has leaked window com.android.internal.policy... exception
if (spinner != null) {
spinner.setVisibility(View.GONE);
}
super.onDetach();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// If we are returning here from a screen orientation
// and the AsyncTask is still working, re-create and display the
// progress dialog.
if (isTaskRunning) {
load(listView);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_twitter, container, false);
listView = (ListView) rootView.findViewById(R.id.card_listView);
spinner = (ProgressBar)rootView.findViewById(R.id.progressBar1);
spinner.setVisibility(View.GONE);
listView.addHeaderView(new View(getActivity()));
listView.addFooterView(new View(getActivity()));
// call method to download tweets
downloadTweets();
return rootView;
}
public void load(View view){
spinner.setVisibility(View.VISIBLE);
}
// download twitter timeline after first checking to see if there is a network connection
public void downloadTweets() {
ConnectivityManager connMgr = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
load(listView);
new DownloadTwitterTask(this).execute(ScreenName);
} else {
Log.v(LOG_TAG, "No network connection available.");
}
}
// Uses an AsyncTask to download a Twitter user's timeline
//TODO cancel this when view is changed!
public class DownloadTwitterTask extends AsyncTask<String, Void, String> {
private final TaskListener listener;
final static String CONSUMER_KEY = "";
final static String CONSUMER_SECRET = "";
final static String TwitterTokenURL = "https://api.twitter.com/oauth2/token";
final static String TwitterStreamURL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=";
public DownloadTwitterTask(TaskListener listener) {
this.listener = listener;
}
@Override
protected String doInBackground(String... screenNames) {
String result = null;
if (screenNames.length > 0) {
result = getTwitterStream(screenNames[0]);
}
return result;
}
// onPostExecute convert the JSON results into a Twitter object (which is an Array list of tweets
@Override
protected void onPostExecute(String result) {
listener.onTaskFinished(result);
}
// convert a JSON authentication object into an Authenticated object
private Authenticated jsonToAuthenticated(String rawAuthorization) {
Authenticated auth = null;
if (rawAuthorization != null && rawAuthorization.length() > 0) {
try {
Gson gson = new Gson();
auth = gson.fromJson(rawAuthorization, Authenticated.class);
} catch (IllegalStateException ex) {
// just eat the exception
}
}
return auth;
}
最佳答案
好吧,即使有人提供了解决方案,我也想尝试提供更好的解决方案。
使用configChanges
不会让您的应用程序在屏幕旋转时重新加载资源,这意味着,如果您对风景和肖像使用不同的布局或其他资源,则它们将完全无用。
您应该从一个片段调用AsyncTask并使用setRetainInstance(true)
方法here,您将找到有关如何执行此操作的很好的解释。
关于android - Android Twitter异步任务在横向崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275469/