在开发者控制台错误报告中,有时我会看到有NPE问题的报告.我不明白我的代码有什么问题.在模拟器上,我的设备应用程序在没有forcecloses的情况下运行良好,但是当调用getActivity()方法时,一些用户在片段类中获得NullPointerException.
活动
pulic class MyActivity extends FragmentActivity{
private ViewPager pager;
private TitlePageIndicator indicator;
private TabsAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
pager = (ViewPager) findViewById(R.id.pager);
indicator = (TitlePageIndicator) findViewById(R.id.indicator);
adapter = new TabsAdapter(getSupportFragmentManager(), false);
adapter.addFragment(new FirstFragment());
adapter.addFragment(new SecondFragment());
indicator.notifyDataSetChanged();
adapter.notifyDataSetChanged();
// push first task
FirstTask firstTask = new FirstTask(MyActivity.this);
// set first fragment as listener
firstTask.setTaskListener((TaskListener) adapter.getItem(0));
firstTask.execute();
}
indicator.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
Fragment currentFragment = adapter.getItem(position);
((Taskable) currentFragment).executeTask();
}
@Override
public void onPageScrolled(int …Run Code Online (Sandbox Code Playgroud) android nullpointerexception android-asynctask android-fragments android-activity
我不明白我应该放在这里以及这些论点最终的位置?究竟应该放什么,它究竟会去哪里?我是否需要包括所有3或者我可以包括1,2,20?
我使用转换我的代码Handler来AsyncTask.后者非常擅长它 - 在主UI线程中异步更新和处理结果.我不清楚的是,如果出现问题,如何处理异常AsyncTask#doInBackground.
我这样做的方法是有一个错误处理程序并向它发送消息.它工作正常,但它是"正确的"方法还是有更好的选择?
另外我理解如果我将错误处理程序定义为Activity字段,它应该在UI线程中执行.但是,有时(非常不可预测)我会得到一个异常,说触发的代码Handler#handleMessage是在错误的线程上执行的.我应该初始化错误处理程序Activity#onCreate吗?放置runOnUiThread到Handler#handleMessage似乎是多余的,但执行非常可靠.
我有以下asynctask类,它不在活动中.在我正在初始化asynctask的活动中,我希望asynctask将回调报告回我的活动.可能吗?或者asynctask是否必须与活动位于同一个类文件中?
protected void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
caller.sometextfield.setText("bla");
}
Run Code Online (Sandbox Code Playgroud)
像这样的东西?
Service,Async Task&Thread之间有什么区别.如果我没有错,他们都习惯在后台做一些事情.那么,如何决定使用哪个以及何时使用?
我正在为我的应用程序使用支持库.在我的FragmentActivity中,我使用AsyncTask从Internet下载数据.在onPreExecute()方法中我添加了一个Fragment,在onPostExecute()方法中我再次删除它.当两者之间的方向发生变化时,我得到了上述异常.请看一下细节:
private class onFriendAddedAsyncTask extends AsyncTask<String, Void, String> {
DummyFragment dummyFragment;
FragmentManager fm;
FragmentTransaction ft;
@Override
protected void onPreExecute() {
Log.v("MyFragmentActivity", "onFriendAddedAsyncTask/onPreExecute");
dummyFragment = DummyFragment.newInstance();
fm = getSupportFragmentManager();
ft = fm.beginTransaction();
ft.add(dummyFragment, "dummy_fragment");
ft.commit();
}
@Override
protected void onPostExecute(String result) {
Log.v("MyFragmentActivity", "onFriendAddedAsyncTask/onPostExecute");
ft = fm.beginTransaction();
ft.remove(dummyFragment);
ft.commit();
}
@Override
protected String doInBackground(String... name) {
Log.v("MyFragmentActivity", "onFriendAddedAsyncTask/doInBackground");
...
}
Run Code Online (Sandbox Code Playgroud)
我得到了以下LogCut:
01-05 23:54:19.958: V/MyFragmentActivity(12783): onFriendAddedAsyncTask/onPreExecute
01-05 23:54:19.968: V/DummyFragment(12783): onAttach
01-05 23:54:19.968: V/DummyFragment(12783): onCreate
01-05 23:54:19.968: V/MyFragmentActivity(12783): onFriendAddedAsyncTask/doInBackground
01-05 23:54:19.973: V/DummyFragment(12783): onCreateView …Run Code Online (Sandbox Code Playgroud) android exception android-asynctask illegalstateexception android-fragments
在UI中,为了执行一些后台工作,我使用了一个单独的Thread.但正如其他人所说,我现在正在使用AsyncTask.
a Thread和an 之间的主要区别是AsyncTask什么?
在哪种情况下,我应该使用a Thread还是AsyncTask?
既然Honeycomb又v4 Compatibility Library可以使用AsyncTaskLoader.据我所知,它AsyncTaskLoader可以通过配置更改生存,如屏幕翻转.
是否建议使用AsyncTaskLoader而不是AsyncTask?是否LoaderManager也参与其中?
但我没有找到任何关于如何正确使用的好例子AsyncTaskLoader.文档也没有提供任何示例.谁能提供一些很好的例子.
在我的Activity中,我使用了一个从AsyncTask扩展的类和一个参数,该参数是AsyncTask的一个实例.我打电话的时候mInstanceOfAT.execute("")一切都很好.但是当我按下再次调用AsyncTask的更新按钮时应用程序崩溃(如果网络作业不起作用).因此出现了一个例外情况
无法执行任务:任务已经执行(任务只能执行一次)
我试过为Asyctask的实例调用cancel(true),但它也不起作用.到目前为止唯一的解决方案是创建Asyntask的新实例.这是正确的方法吗?
谢谢.
我有一个AsyncTask我执行的类,它从网站下载大量数据.
如果最终用户在使用时数据连接速度非常慢或不稳定,我想AsyncTask在一段时间后进行超时.我的第一个方法是这样的:
MyDownloader downloader = new MyDownloader();
downloader.execute();
Handler handler = new Handler();
handler.postDelayed(new Runnable()
{
@Override
public void run() {
if ( downloader.getStatus() == AsyncTask.Status.RUNNING )
downloader.cancel(true);
}
}, 30000 );
Run Code Online (Sandbox Code Playgroud)
启动后AsyncTask,一个新的处理程序被启动,将取消AsyncTask30秒后,如果它仍在运行.
这是一个好方法吗?或者内置的AsyncTask内容是否更适合此目的?