android - Android Twitter异步任务在横向崩溃

标签 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;
    } 

最佳答案

好吧,即使有人提供了解决方案,我也想尝试提供更好的解决方案。
使用configChanges不会让您的应用程序在屏幕旋转时重新加载资源,这意味着,如果您对风景和肖像使用不同的布局或其他资源,则它们将完全无用。
您应该从一个片段调用AsyncTask并使用setRetainInstance(true)方法here,您将找到有关如何执行此操作的很好的解释。

关于android - Android Twitter异步任务在横向崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275469/

相关文章:

安卓 jni "No Rule to make Target issue"

android - 修改 android.jar 类并在 Android 设备中替换它?

android - textView 上的 setAnimation 无效

entity-framework - 是否必须在异步 EF 上等待 SaveChangesAsync()?

ios - Codenameone IOS应用程序随机崩溃

android - 在iOS和Android上使用带有混合语言文本的自定义字体

php - Guzzle 正在同步发送请求

.net - 如何创建异步控制包装器?

iphone - [AVPlaybackItem fpItem] : message sent to deallocated instance

wpf - WPF-在IsMouseOver上使用ToggleButton触发器时,程序失败