2014-09-25 141 views
0

嗨,我有一個與我的應用probem。當屏幕旋轉時它崩潰。應用程序正在運行,但每當我嘗試旋轉屏幕它崩潰,這是我得到的錯誤。你有想法如何解決這個問題嗎?感謝屏幕旋轉RuntimeError

09-25 00:19:30.283: D/dalvikvm(2649): GC_CONCURRENT freed 494K, 21% free 3005K/3804K, paused 34ms+32ms, total 350ms 
09-25 00:19:31.253: D/AndroidRuntime(2649): Shutting down VM 
09-25 00:19:31.283: W/dalvikvm(2649): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
09-25 00:19:31.493: E/AndroidRuntime(2649): FATAL EXCEPTION: main 
09-25 00:19:31.493: E/AndroidRuntime(2649): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projectsoftware/com.projectsoftware.AlbumsActivity}: java.lang.NullPointerException 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3692) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread.access$700(ActivityThread.java:141) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.os.Looper.loop(Looper.java:137) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at dalvik.system.NativeStart.main(Native Method) 
09-25 00:19:31.493: E/AndroidRuntime(2649): Caused by: java.lang.NullPointerException 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at com.projectsoftware.AlbumsActivity$1.onTextChanged(AlbumsActivity.java:76) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.widget.TextView.sendOnTextChanged(TextView.java:7231) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.widget.TextView.setText(TextView.java:3699) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.widget.TextView.setText(TextView.java:3554) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.widget.EditText.setText(EditText.java:80) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.widget.TextView.setText(TextView.java:3529) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.widget.TextView.onRestoreInstanceState(TextView.java:3429) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.view.View.dispatchRestoreInstanceState(View.java:12093) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2588) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2588) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.view.View.restoreHierarchyState(View.java:12071) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1634) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.Activity.onRestoreInstanceState(Activity.java:938) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ListActivity.onRestoreInstanceState(ListActivity.java:219) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.Activity.performRestoreInstanceState(Activity.java:910) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1131) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2158) 
09-25 00:19:31.493: E/AndroidRuntime(2649):  ... 12 more 
09-25 00:19:39.853: I/Process(2649): Sending signal. PID: 2649 SIG: 9 

下面是代碼

@SuppressLint({ "NewApi", "ViewHolder" }) 
public class AlbumsActivity extends ListActivity { 

    Button imgClick; 
    EditText inputSearch; 


    JSONArray albums = null;    
    JSONParser jsonParser = new JSONParser(); 

    SimpleAdapter adapter = null; 
    ArrayList<HashMap<String, String>> albumsList; 
    AlertDialogManager alert = new AlertDialogManager(); 

    private ProgressDialog pDialog; 
    private static final String URL_ALBUMS = "http://api.androidhive.info/songs/albums.php"; 
    private static final String TAG_ID = "id"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_SONGS_COUNT = "songs_count"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_albums); 

     getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#ff6d9850"))); 
     getActionBar().setIcon(new ColorDrawable(getResources().getColor(android.R.color.transparent))); 

     albumsList = new ArrayList<HashMap<String, String>>(); 

     inputSearch = (EditText) findViewById(R.id.inputSearch); 
     inputSearch.addTextChangedListener(new TextWatcher() { 

    @Override 
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
     AlbumsActivity.this.adapter.getFilter().filter(cs.toString()); 
    } 

    @Override 
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {} 

    @Override 
    public void afterTextChanged(Editable arg0) {} 
    }); 

     new LoadAlbums().execute(); 

     LayoutInflater inflater = getLayoutInflater(); 
     View view = inflater.inflate(R.layout.list_item_albums, null); 
     imgClick = (Button)view.findViewById(R.id.row_click_imageView1); 

     imgClick.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
        showPopupMenu(v); 
      } 
     }); 
    } 

    public void toast(View v){ 
     showPopupMenu(v); 
    } 
    private void showPopupMenu(View v){ 
     PopupMenu pop = new PopupMenu(AlbumsActivity.this, v); 
     pop.getMenuInflater().inflate(R.menu.menu,pop.getMenu()); 

     pop.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 

      @Override 
      public boolean onMenuItemClick(MenuItem arg0) { 
       Intent i = new Intent(getApplicationContext(), MainActivity.class); 

       String album_name = ((TextView) findViewById(R.id.album_name)).getText().toString(); 
       i.putExtra("album_name", album_name); 
       startActivity(i); 
       return true; 
      } 
      }); 
     pop.show(); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data){ 
     super.onActivityResult(requestCode, resultCode, data); 

     if(requestCode == 2){ 
      if(resultCode == RESULT_OK){ 
      String message = data.getStringExtra("Message"); 
      TextView text = (TextView) findViewById(R.layout.activity_main); 
      text.setText(message); 
      } 
     } 
    } 

    class LoadAlbums extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(AlbumsActivity.this); 
      pDialog.setMessage("Loading ..."); 
      pDialog.setIndeterminate(false); 
      pDialog.show(); 
      pDialog.setCancelable(false); 
     } 

     protected String doInBackground(String... args) { 

      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      String json = jsonParser.makeHttpRequest(URL_ALBUMS, "GET", params); 

      Log.d("Albums JSON: ", "> " + json); 

      try {    
       albums = new JSONArray(json); 

       if (albums != null) { 
        for (int i = 0; i < albums.length(); i++) { 
         JSONObject c = albums.getJSONObject(i); 

         String id = c.getString(TAG_ID); 
         String name = c.getString(TAG_NAME); 
         String songs_count = c.getString(TAG_SONGS_COUNT); 

         HashMap<String, String> map = new HashMap<String, String>(); 

         map.put(TAG_ID, id); 
         map.put(TAG_NAME, name); 
         map.put(TAG_SONGS_COUNT, songs_count); 

         albumsList.add(map); 
        } 
       }else{ 
        Log.d("Albums: ", "null"); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     protected void onPostExecute(String file_url) { 
      runOnUiThread(new Runnable() { 
       public void run() { 
        ListView lv = getListView(); 
        lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) { 

          Intent i = new Intent(getApplicationContext(), TrackListActivity.class); 

          String album_id = ((TextView) view.findViewById(R.id.album_id)).getText().toString(); 
          i.putExtra("album_id", album_id);    
          startActivity(i); 
         } 
        });  

        AlbumsActivity.this.adapter = new SimpleAdapter(AlbumsActivity.this, albumsList, R.layout.list_item_albums, new String[] { TAG_ID, TAG_NAME, TAG_SONGS_COUNT }, new int[] {R.id.album_id, R.id.album_name, R.id.songs_count }); 
        setListAdapter(AlbumsActivity.this.adapter); 

        pDialog.dismiss(); 
       } 
      }); 

     } 
    } 
} 
+0

一些代碼會很好... – 2014-09-25 00:30:58

+0

我編輯了我的文章。請檢查並查看代碼。謝謝 – Jonathan 2014-09-25 00:35:28

+0

onTextChanged()方法在Activity重新創建時被調用。添加檢查'cs'是否爲空 – 2014-09-25 00:36:54

回答

1

在運行時配置更改(如屏幕方向更改)期間,默認情況下android會重新啓動正在運行的活動,以便您能夠處理此運行時配置更改。這就是爲什麼你會得到NullPointerException,因爲你的活動重新啓動,因此你需要在那裏管理你的對象的初始化/保持狀態。這裏的官方安卓指南可能會幫助你解決你的問題http://developer.android.com/guide/topics/resources/runtime-changes.html

-1

當屏幕旋轉時,Activity將被重新創建時,OnCreate()方法將被執行,並且EditTextOnTextChanged()方法將被調用,但現在csnull

爲了解決這個問題,我們可以添加活動屬性:

"android: configChanges = "orientation | keyboardHidden" 

當屏幕旋轉時,它不會調用onCreate()方法了。 與此同時,我們重寫方法來偵聽屏幕方向更改。

+0

這不是一個修復,那是一個繃帶。您需要能夠隨時處理正在重新創建的活動。 – kcoppock 2014-09-25 02:33:00

+0

夥計!他正確地發現了這個問題!不僅如此,他提供了一個非常常用的解決方案!是的,有更好的解決方案...所以*給一個! – 2014-09-25 02:37:15

+0

這不是一個解決方案,它隱藏了*問題。如果將應用程序置於背景並且Android會終止您的活動,您仍然會崩潰。或者如果有人更改語言環境。或刪除SIM卡。或者其他任何配置更改。 – kcoppock 2014-09-25 02:46:58