java - 类转换异常错误 fragment

标签 java android exception casting

我做了这个教程http://javapapers.com/android/android-twitter-feed-reader/在 Eclipse 中并将我的项目移至工作室。有人可以帮助解释这些错误的含义以及我如何解决它们吗?我的logcat如下:

java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.ClassCastException: com.example.ishonours.witsbusapp.TwitterFragment cannot be cast to android.app.ListActivity
            at com.example.ishonours.witsbusapp.TwitterAsyncTask.doInBackground(TwitterAsyncTask.java:24)
            at com.example.ishonours.witsbusapp.TwitterAsyncTask.doInBackground(TwitterAsyncTask.java:15)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

这是我的 TwitterAsyncTask 类:

import android.app.ListActivity;
import android.text.method.LinkMovementMethod;
import android.widget.ArrayAdapter;
import android.os.AsyncTask;
import android.widget.ListView;
import android.widget.TextView;

import com.example.ishonours.witsbusapp.TwitterAPI;
import com.example.ishonours.witsbusapp.TwitterTweet;

import java.util.ArrayList;

public class TwitterAsyncTask extends AsyncTask<Object, Void, ArrayList<TwitterTweet>> {
    ListActivity callerActivity;

    final static String TWITTER_API_KEY = "xxx";
    final static String TWITTER_API_SECRET = "xxx";

    @Override
    protected ArrayList<TwitterTweet> doInBackground(Object... params) {
        ArrayList<TwitterTweet> twitterTweets = null;
        callerActivity = (ListActivity) params[1];
        if (params.length > 0) {
            TwitterAPI twitterAPI = new TwitterAPI(TWITTER_API_KEY,TWITTER_API_SECRET);
            twitterTweets = twitterAPI.getTwitterTweets(params[0].toString());
        }
        return twitterTweets;
    }

    @Override
    protected void onPostExecute(ArrayList<TwitterTweet> twitterTweets) {
        ArrayAdapter<TwitterTweet> adapter =
                new ArrayAdapter<TwitterTweet>(callerActivity, R.layout.twitter_tweets_list,
                        R.id.listTextView, twitterTweets);
        callerActivity.setListAdapter(adapter);
        ListView lv = callerActivity.getListView();
        lv.setDividerHeight(0);
        //lv.setDivider(this.getResources().getDrawable(android.R.color.transparent));
        //lv.setBackgroundColor(callerActivity.getResources().getColor(R.color.Twitter_blue));
    }
}

我应该提到我对此非常陌生。这些评论让我对这个错误有了一些看法。我仍然不太确定如何解决它。还有其他建议吗?

这是另一个类,TwitterFragment:

public class TwitterFragment extends ListFragment {

    private static final String ARG_SECTION_NUMBER = "4";

    private OnFragmentInteractionListener mListener;

    public static TwitterFragment newInstance(int menuNumber) {
        TwitterFragment fragment = new TwitterFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, menuNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public TwitterFragment() {
    }

    //i added
    final static String twitterScreenName = "WitsServices";
    final static String TAG = "MainActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //i added
        AndroidNetworkUtility androidNetworkUtility = new AndroidNetworkUtility();
        if (androidNetworkUtility.isConnected(this)) {
            new TwitterAsyncTask().execute(twitterScreenName,this);
        } else {
            Log.v(TAG, "Network not Available!");
        }


        //setListAdapter(new ArrayAdapter<DummyContent.DummyItem>(getActivity(),
        //        android.R.layout.simple_list_item_1, android.R.id.text1, DummyContent.ITEMS));
    }


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(
                getArguments().getInt(ARG_SECTION_NUMBER));
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        if (null != mListener) {
            // Notify the active callbacks interface (the activity, if the
            // fragment is attached to one) that an item has been selected.
            //mListener.onFragmentInteraction(DummyContent.ITEMS.get(position).id);
        }
    }

    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(String id);
    }

}

最佳答案

当这条线运行时,

callerActivity = (ListActivity) params[1];

代码假定 params 数组中索引 1 处的对象可以转换为 ListActivity 类型。但它发现类型是 TwitterFragment - 不兼容的转换,因此您会收到此错误。

鉴于您采用任意对象数组作为输入,崩溃的可能原因是当您创建并调用 AsyncTask 时,您必须传入 TwitterFragment,而不是传递 ListActivity 类型的类。

关于java - 类转换异常错误 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31975021/

相关文章:

java - 使用RequestMapping无法获取表单数据的处理方法

java - 尝试填充单链表

java - 在 Android 上使用 andengine 在 ButtonSprite 上添加 OnClickListener

java - Android - 如何关闭由startForeground启动的服务中的通知?

objective-c - cocoa 中 try/catch 内部的错误传播

java - 在 Java 中实现 REST API 客户端和 JSON 解析器的最简单方法?

java - 如何使用 Java 检索 Mysql 中表的两个字段?

android - 在 Android Studio 中更改多个(非常)相似的文件

Python 从异常中获取错误代码

Python 异常 : EAFP and What is Really Exceptional?