![](/img/trans.png)
[英]Can not create handler inside thread that has not called Looper.prepare()
[英]How to overcome “Can't create handler inside thread that has not called Looper.prepare()” issue?
我正在嘗試在viewpager中創建片段。 在適配器中,我使用線程來創建片段。 在線程內部,我正在執行AsyncTask,它進一步獲取片段。 在每個片段類(OneFragment,TwoFragment)中,我都有AsyncTask,它們可以從Web訪問一些API。 如果我根本不使用線程和AsyncTask,則該應用程序效果很好。 我正在使用它來提高UI性能。 但這是在獲取錯誤。 我已經討論了關於同一問題的一些已經存在的主題。 但是我不知道原因。 誰能指出我在這里做錯了什么?
這是我的適配器類和AsyncTask類:
class SectionsPagerAdapter extends FragmentStatePagerAdapter {
Activity activity;
Fragment f = null;
public SectionsPagerAdapter(FragmentManager fm, Activity activity) {
super(fm);
this.activity = activity;
}
@Override
public Fragment getItem(int i) {
switch (i) {
case 0: {
activity.runOnUiThread(new Runnable() {
public void run() {
try {
f = new FetchFragment().execute("one").get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
return f;
}
case 1: {
activity.runOnUiThread(new Runnable() {
public void run() {
try {
f = new FetchFragment().execute("two").get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
return f;
}
}
return null;
}
@Override
public int getCount() {
return 2;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "one";
case 1:
return "two";
}
return null;
}
class FetchFragment extends AsyncTask<String, Void, Fragment>
{
@Override
protected Fragment doInBackground(String... arg0) {
if(arg0[0].equalsIgnoreCase("one"))
{
Fragment fragment = new OneFragment();
Bundle args = new Bundle();
args.putInt(CategoriesFragment.ARG_SECTION_NUMBER, 1);
fragment.setArguments(args);
return fragment;
}
if(arg0[0].equalsIgnoreCase("two"))
{
Fragment fragment = new TwoFragment();
Bundle args = new Bundle();
args.putInt(FeaturedFragment.ARG_SECTION_NUMBER, 2);
fragment.setArguments(args);
return fragment;
}
return null;
}
@Override
protected void onPostExecute(Fragment fragment){}
}
}
這是我的錯誤日志。
10-23 12:52:28.835: E/AndroidRuntime(17485): FATAL EXCEPTION: AsyncTask #3
10-23 12:52:28.835: E/AndroidRuntime(17485): java.lang.RuntimeException: An error occured while executing doInBackground()
10-23 12:52:28.835: E/AndroidRuntime(17485): at android.os.AsyncTask$3.done(AsyncTask.java:299)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-23 12:52:28.835: E/AndroidRuntime(17485): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.lang.Thread.run(Thread.java:856)
10-23 12:52:28.835: E/AndroidRuntime(17485): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10-23 12:52:28.835: E/AndroidRuntime(17485): at android.os.Handler.<init>(Handler.java:121)
10-23 12:52:28.835: E/AndroidRuntime(17485): at android.support.v4.app.ListFragment.<init>(ListFragment.java:47)
10-23 12:52:28.835: E/AndroidRuntime(17485): at com.store.fragments.OneFragment.<init>(OneFragment.java:68)
10-23 12:52:28.835: E/AndroidRuntime(17485): at com.store.adapter.SectionsPagerAdapter$FetchFragment.doInBackground(SectionsPagerAdapter.java:173)
10-23 12:52:28.835: E/AndroidRuntime(17485): at com.store.adapter.SectionsPagerAdapter$FetchFragment.doInBackground(SectionsPagerAdapter.java:1)
10-23 12:52:28.835: E/AndroidRuntime(17485): at android.os.AsyncTask$2.call(AsyncTask.java:287)
10-23 12:52:28.835: E/AndroidRuntime(17485): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
好的,您使用asynctasks做錯了。 通常,異步任務用於一些耗時的操作,這些操作應該在后台處理,但是您試圖在UiThread上運行它。 並且在asynctask中,您嘗試在doInBackground()中修改UI,但強烈建議在onPostExecute()中進行修改
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.