2014-10-04 77 views
0

我想在onCreateView方法的PlanetFragment类的onPageFinished方法中使用处理程序。但我得到looper.prepare()错误。请帮忙。还请告诉是否有更好的方法来使用进度条。无法使用处理程序,越来越looper.prepare错误

public class MainActivity extends Activity { 

private DrawerLayout mDrawerLayout; 
private ListView mDrawerList; 
private ActionBarDrawerToggle mDrawerToggle; 

private CharSequence mDrawerTitle; 
private CharSequence mTitle; 
private String[] mPlanetTitles; 

static Handler progressBarHandler; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mTitle = mDrawerTitle = getTitle(); 
    mPlanetTitles = getResources().getStringArray(R.array.planets_array); 
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    mDrawerList = (ListView) findViewById(R.id.left_drawer); 

    // set a custom shadow that overlays the main content when the drawer 
    // opens 
    mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, 
      GravityCompat.START); 
    // set up the drawer's list view with items and click listener 
    mDrawerList.setAdapter(new ArrayAdapter<String>(this, 
      R.layout.drawer_list_item, mPlanetTitles)); 
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); 

    // enable ActionBar app icon to behave as action to toggle nav drawer 
    getActionBar().setDisplayHomeAsUpEnabled(true); 
    getActionBar().setHomeButtonEnabled(true); 

    // ActionBarDrawerToggle ties together the the proper interactions 
    // between the sliding drawer and the action bar app icon 
    mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */ 
    mDrawerLayout, /* DrawerLayout object */ 
    R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */ 
    R.string.drawer_open, /* "open drawer" description for accessibility */ 
    R.string.drawer_close /* "close drawer" description for accessibility */ 
    ) { 
     public void onDrawerClosed(View view) { 
      getActionBar().setTitle(mTitle); 
      invalidateOptionsMenu(); // creates call to 
             // onPrepareOptionsMenu() 
     } 

     public void onDrawerOpened(View drawerView) { 
      getActionBar().setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); // creates call to 
             // onPrepareOptionsMenu() 
     } 
    }; 
    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (savedInstanceState == null) { 
     selectItem(0); 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

/* Called whenever we call invalidateOptionsMenu() */ 
@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    // If the nav drawer is open, hide action items related to the content 
    // view 
    boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
    menu.findItem(R.id.action_websearch).setVisible(!drawerOpen); 
    return super.onPrepareOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // The action bar home/up action should open or close the drawer. 
    // ActionBarDrawerToggle will take care of this. 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 
     return true; 
    } 
    // Handle action buttons 
    switch (item.getItemId()) { 
    case R.id.action_websearch: 
     // create intent to perform web search for this planet 
     Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); 
     intent.putExtra(SearchManager.QUERY, getActionBar().getTitle()); 
     // catch event that there's no activity to handle intent 
     if (intent.resolveActivity(getPackageManager()) != null) { 
      startActivity(intent); 
     } else { 
      Toast.makeText(this, R.string.app_not_available, 
        Toast.LENGTH_LONG).show(); 
     } 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

/* The click listner for ListView in the navigation drawer */ 
private class DrawerItemClickListener implements 
     ListView.OnItemClickListener { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, 
      long id) { 
     selectItem(position); 
    } 
} 

private void selectItem(int position) { 
    // update the main content by replacing fragments 
    Fragment fragment = new PlanetFragment(); 
    Bundle args = new Bundle(); 
    args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); 
    fragment.setArguments(args); 

    FragmentManager fragmentManager = getFragmentManager(); 
    fragmentManager.beginTransaction() 
      .replace(R.id.content_frame, fragment).commit(); 

    // update selected item and title, then close the drawer 
    mDrawerList.setItemChecked(position, true); 
    setTitle(mPlanetTitles[position]); 
    mDrawerLayout.closeDrawer(mDrawerList); 
} 

@Override 
public void setTitle(CharSequence title) { 
    mTitle = title; 
    getActionBar().setTitle(mTitle); 
} 

/** 
* When using the ActionBarDrawerToggle, you must call it during 
* onPostCreate() and onConfigurationChanged()... 
*/ 

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    // Sync the toggle state after onRestoreInstanceState has occurred. 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    // Pass any configuration change to the drawer toggls 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

/** 
* Fragment that appears in the "content_frame", shows a planet 
*/ 
public static class PlanetFragment extends Fragment { 
    public static final String ARG_PLANET_NUMBER = "planet_number"; 

    public PlanetFragment() { 
     // Empty constructor required for fragment subclasses 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_planet, 
       container, false); 
     int i = getArguments().getInt(ARG_PLANET_NUMBER); 
     String planet = getResources() 
       .getStringArray(R.array.planets_array)[i]; 

     int imageId = getResources().getIdentifier(
       planet.toLowerCase(Locale.getDefault()), "drawable", 
       getActivity().getPackageName()); 

     final WebView webview = ((WebView) rootView 
       .findViewById(R.id.image)); 

     final ProgressBar progressbar = ((ProgressBar) rootView 
       .findViewById(R.id.progressbar)); 

     webview.getSettings().setJavaScriptEnabled(true); 
     final PlanetFragment activity = this; 

     webview.setWebViewClient(new WebViewClient() { 

      @Override 
      public void onPageStarted(WebView view, String url, 
        Bitmap favicon) { 
       view.setVisibility(View.GONE);// hide the webview that will 
               // display your dialog 
       new Thread(new Runnable() { 
        private int progressBarStatus = 0; 

        private int fileSize; 

        public void run() { 
         progressBarHandler = new Handler(); 
         while (progressBarStatus < 100) { 

          // process some tasks 
          progressBarStatus = doWork(); 

          // your computer is too fast, sleep 1 second 
          try { 
           Thread.sleep(1000); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 

          // Update the progress bar 
          progressBarHandler.post(new Runnable() { 
           public void run() { 
            progressbar 
              .setProgress(progressBarStatus); 

           } 
          }); 
         } 

         // ok, file is downloaded, 
         if (progressBarStatus >= 100) { 

          // sleep 2 seconds, so that you can see the 100% 
          try { 
           Thread.sleep(500); 
          } catch (InterruptedException e) { 
           e.printStackTrace(); 
          } 

         } 
        } 

        private int doWork() { 
         while (fileSize <= 1000000) { 

          fileSize++; 

          if (fileSize == 100000) { 
           return 10; 
          } else if (fileSize == 200000) { 
           return 20; 
          } else if (fileSize == 300000) { 
           return 30; 
          } else if (fileSize == 200000) { 
           return 40; 
          } else if (fileSize == 300000) { 
           return 50; 
          } else if (fileSize == 200000) { 
           return 60; 
          } else if (fileSize == 300000) { 
           return 70; 
          } else if (fileSize == 200000) { 
           return 80; 
          } else if (fileSize == 300000) { 
           return 90; 
          } 

         } 

         return 100; 

        } 
       }).start(); 

      } 

      @Override 
      public void onPageFinished(WebView view, String url) { 
       progressBarHandler = new Handler(); 
       webview.loadUrl("javascript:document.getElementsByClassName('header')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('icon-anon')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('search')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('wh_ad')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('cse_x')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('wh_search')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('wh_ad')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('wh_ad')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('footer_random_button')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('mw-mf-page-left')[0].style.display=\"none\";"); 
       webview.loadUrl("javascript:document.getElementsByClassName('mw-mf-viewport')[0].style.display=\"none\";"); 

       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         // Code here will run in UI thread 
        } 
       },1000); 

       webview.getSettings().setJavaScriptEnabled(false); 
       view.setVisibility(View.VISIBLE); 
       // you might need this 
       view.bringToFront(); 
      } 
     }); 

     webview.loadUrl(planet); 
     getActivity().setTitle(planet); 
     return rootView; 
    } 
} 

}

+0

我也试过,但它也给予同样的错误\t \t \t新的处理程序(Looper.getMainLooper())。postdelayed(新的Runnable(){ \t \t \t \t \t @覆盖 \t \t \t \t \t公共无效的run (){ \t \t \t \t \t Log.d( “UI线程”, “我是在UI线程”); \t \t \t \t \t} \t \t \t \t \t},1000); – 2014-10-04 18:00:18

回答

0

您在活动创造处理

只是初始化处理器在活动

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

     progressBarHandler = new Handler(); 
    // rest of your code 

的onCreate方法和删除初始化中片段类为它已在Activity中初始化。在片段类中使用progressBarHandler,它会正常工作。

相关问题