我做了这个教程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/