Android twitter异步任务在横向崩溃

时间:2014-12-03 15:27:48

标签: android asynchronous crash orientation landscape

在同一个问题上花了太多时间,所以我想为什么不问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;
    } 

2 个答案:

答案 0 :(得分:0)

在Manifest中的Activity条目中添加以下行:

android:configChanges="layoutDirection|keyboardHidden|orientation|screenSize|screenLayout"

答案 1 :(得分:0)

即使有人提出解决方案,我也想尝试给出更好的解决方案。 使用configChanges不会让您的应用程序在旋转屏幕时重新加载资源,这意味着如果您使用不同的布局或其他资源进行横向和移植,它们将完全无用。 您应该从片段中调用AsyncTask并使用setRetainInstance(true)方法here,您将找到有关如何执行此操作的详细说明。

相关问题