【发布时间】:2014-03-07 11:16:10
【问题描述】:
我有 3 个标签,例如 android development tutorial
现在我想做的很简单,我在每个页面上使用 Fragments。我想在每个页面上显示来自 rss 提要的不同内容。
问题是当我转到下一个选项卡时,它会运行上一个 Fragment 的 AsyncTask(位于 onCreateView 中)。
所以你从第 1 页开始,它会很好地加载内容。然后,当您转到第 2 页时,再次运行第 1 页的 Fragment 的 onCreateView。并且显然给出了 NullException。关键是它根本不应该在第 2 页运行第 1 页的 AsyncTask。
我认为不需要任何示例代码,如果需要告诉我您需要查看哪个部分。然后我将编辑我的问题。
ListFragment 中的 AsyncTask :
public class MyAsyncTask extends AsyncTask<List<String>, Void, List<String>>
{
// List of messages of the rss feed
private List<Message> messages;
private volatile boolean running = true;
@SuppressWarnings("unused")
private WeakReference<NieuwsSectionFragment> fragmentWeakRef;
private MyAsyncTask(NieuwsSectionFragment fragment)
{
this.fragmentWeakRef = new WeakReference<NieuwsSectionFragment>(fragment);
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
mProgress.show();
// progress.setVisibility(View.VISIBLE); //<< set here
}
@Override
protected void onCancelled()
{
Log.w("onCancelled", "now cancelled");
running = false;
}
@Override
protected List<String> doInBackground(List<String>... urls)
{
FeedParser parser = FeedParserFactory.getParser();
messages = parser.parse();
List<String> titles = new ArrayList<String>(messages.size());
for (Message msg : messages)
{
titles.add(msg.getTitle());
// Log.w("doInBackground", msg.getTitle());
}
return titles;
}
@Override
protected void onPostExecute(List<String> result)
{
super.onPostExecute(result);
mProgress.dismiss();
if (result != null)
{
PostData data = null;
listData = new PostData[result.size()];
for (int i = 0; i < result.size(); i++)
{
data = new PostData();
data.postTitle = result.get(i);
data.postThumbUrl = "http://igo.nl/foto/app_thumb/28991-Taxi-vast-na-poging-tot-nemen-van-sluiproute.jpg";
listData[i] = data;
Log.w("onPostExecute", "" + listData[i].postTitle);
}
adapter = new PostItemAdapter (getActivity(), android.R.layout.simple_list_item_1, listData);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
}
}
}
它在一个方法内部被调用,该方法在 ListFragment 的 onCreateView 内部执行:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
startNewAsyncTask();
View rootView = inflater.inflate(R.layout.fragment_section_nieuws, container, false);
return rootView;
}
@SuppressWarnings("unchecked")
public void startNewAsyncTask()
{
MyAsyncTask asyncTask = new MyAsyncTask(this);
this.asyncTaskWeakRef = new WeakReference<MyAsyncTask>(asyncTask);
asyncTask.execute();
}
LogCat:
【问题讨论】:
-
请发布您的代码并记录 cat !
-
我不知道您希望看到代码的哪一部分,因为内容的加载是从第一页开始的。当 logcat 在不应该运行它的页面上运行
AsyncTask时,它只会给出NullPointerException,这是合乎逻辑的。 -
发布你的异步任务和从它调用的代码片段..连同你的日志猫错误。错误必须指出出现空指针的行。也发布该部分
-
在哪一行出现空指针异常?
-
它指向的行是适配器初始化的地方。我认为这是因为列表项不再可访问,但我可能错了。当我转到该页面时停止运行 AsyncTask 时,该错误应该消失了。
标签: android android-fragments android-asynctask android-viewpager android-fragmentactivity