2014-08-29 58 views
-2

我遇到显示站点上的实时内容任务的问题。方向更改后ProgressBar崩溃

我一直在玩这段代码一段时间,并玩弄状态,但我似乎无法让它正常工作。

迄今为止唯一能够提出的解决方案是完全禁用方向更改,但如果可能,我宁愿不这样做。

这里是堆栈跟踪:

STACK_TRACE = java.lang.IllegalArgumentException异常:查看不android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:653) 在机器人附连到窗口管理器 。 view.WindowManagerImpl.removeView(WindowManagerImpl.java:349) 在android.view.WindowManagerImpl $ CompatModeWrapper.removeView(WindowManagerImpl.java:160) 在android.app.Dialog.dismissDialog(Dialog.java:319) 的机器人。 app.dialog.dismiss(Dialog.java:302) at cl.cromer.tronwell.concepcion.Progress.dismiss (Progress.java:72) at cl.cromer.tronwell.concepcion.AdditionalMaterial.databaseLoaded(AdditionalMaterial.java:149) at cl.cromer.tronwell.concepcion.AdditionalMaterial.access $ 13(AdditionalMaterial.java:122) at cl.cromer.tronwell.concepcion.AdditionalMaterial $ 1 $ 1.run(AdditionalMaterial.java:73) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java: 92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5031) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit $ MethodAndArgsCal ler.run(ZygoteInit.java:792) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 在dalvik.system.NativeStart.main(本机方法)

这里是我的类别代码的崩溃:

package cl.cromer.tronwell.concepcion; 

import java.util.Calendar; 
import java.util.HashMap; 

import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.PowerManager; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import android.widget.Toast; 
import cl.cromer.tronwell.concepcion.DBSchema.DBAdditionalMaterial; 
import cl.cromer.tronwell.concepcion.DBSchema.DBAdditionalMaterialGroups; 
import cl.cromer.tronwell.concepcion.Files.Download; 

public class AdditionalMaterial extends ActionBarActivity implements ListenerXML, ListenerDownload, ListenerAsync { 
    private final static String URL = "action=downloads"; 

    private XMLParser xmlParser; 
    private Progress progress = null; 

    // Parsers 
    private SQLParser sqlParser; 

    private Handler threadHandler = new Handler(); 

    // The database 
    private SQLiteDatabase tronDB; 

    private int downloadId = 0; 
    private boolean downloadAll = false; 
    private int downloadCount = 1; 

    private int firstDownloadAvailable = 0; 

    private String fileName; 

    private Files files = new Files(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Log.d("debug", "onCreate"); 
     setContentView(R.layout.activity_additional_material); 

     //progress = new Progress(); 
     //progress.show(this, this, false); 

     sqlParser = new SQLParser(this); 

     new Thread(new Runnable() { 
      public void run() { 
       tronDB = sqlParser.getWritableDatabase(); 
       threadHandler.post(new Runnable() { 
        public void run() { 
         databaseLoaded(); 
        } 
       }); 
      } 
     }).start(); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.d("debug", "onStart"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.d("debug", "onRestart"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     progress = new Progress(); 
     progress.show(this, this, false); 

     Log.d("debug", "onResume"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.d("debug", "onStop"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 

     progress = null; 

     Log.d("debug", "onDestroy"); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 

     Log.d("debug", "onDestroy"); 
    } 

    private void databaseLoaded() { 
     SharedPreferences settings = getSharedPreferences(Settings.PREFERENCES, MODE_PRIVATE); 
     long materialDate = settings.getLong(Settings.MATERIAL_DATE, Settings.MATERIAL_DATE_DEFAULT); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 6); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     long currentDate = calendar.getTimeInMillis(); 

     if (currentDate > materialDate) { 
      // Update the database 
      String rut = settings.getString(Settings.RUT, Settings.RUT_DEFAULT); 
      String password = settings.getString(Settings.PASSWORD, Settings.PASSWORD_DEFAULT); 

      HashMap<String, String> postData = new HashMap<String, String>(); 
      postData.put("rut", rut); 
      postData.put("pass", password); 

      xmlParser = new XMLParser(this, postData); 
      xmlParser.fetchListener = this; // Tell the XMLParser that this activity has the listener 
      xmlParser.execute(MainActivity.URL + URL); 
     } 
     else { 
      // Material does not need to be updated, just show what is in the database 
      if (progress != null && progress.isShowing()) { 
       progress.dismiss(); 
      } 
      ShowContent showContent = new ShowContent(this); 
      showContent.asyncListener = this; // Tell the task that this class is listening 
      showContent.execute(); 
     } 
    } 

    private void fetchFinished(HashMap<String, HashMap<String, String>> xmlData) { 
     // Let's put the groups in the database 
     HashMap<String, String> xmlHash = xmlData.get("1"); 
     String groups = xmlHash.get("groups"); 
     for (int i = 1; i <= Integer.valueOf(groups); i++) { 
      ContentValues values = new ContentValues(); 
      values.put(DBAdditionalMaterialGroups.COLUMN_ID, String.valueOf(i)); 
      values.put(DBAdditionalMaterialGroups.COLUMN_NAME, xmlHash.get("group" + String.valueOf(i))); 
      tronDB.replace(
       DBAdditionalMaterialGroups.TABLE_NAME, 
       null, 
       values); 
     } 

     // Now the material 
     for (int i = 2; i <= xmlData.size() - 1; i++) { 
      xmlHash = xmlData.get(String.valueOf(i)); 

      ContentValues values = new ContentValues(); 
      values.put(DBAdditionalMaterial.COLUMN_ID, xmlHash.get("id")); 
      values.put(DBAdditionalMaterial.COLUMN_NAME, xmlHash.get("title")); 
      values.put(DBAdditionalMaterial.COLUMN_GROUP, xmlHash.get("group")); 
      values.put(DBAdditionalMaterial.COLUMN_TYPE, xmlHash.get("type")); 
      values.put(DBAdditionalMaterial.COLUMN_URL1, xmlHash.get("url1")); 
      values.put(DBAdditionalMaterial.COLUMN_URL2, xmlHash.get("url2")); 
      tronDB.replace(
       DBAdditionalMaterial.TABLE_NAME, 
       null, 
       values); 
     } 

     SharedPreferences settings = getSharedPreferences(Settings.PREFERENCES, MODE_PRIVATE); 
     SharedPreferences.Editor settingsEditor = settings.edit(); 

     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 6); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     long currentDate = calendar.getTimeInMillis(); 

     settingsEditor.putLong(Settings.MATERIAL_DATE, currentDate); 
     settingsEditor.commit(); 

     progress.dismiss(); 

     ShowContent showContent = new ShowContent(this); 
     showContent.asyncListener = this; // Tell the task that this class is listening 
     showContent.execute(); 
    } 

    @TargetApi(Build.VERSION_CODES.FROYO) 
    protected class ShowContent extends AsyncTask<String, View, Void> { 
     private Context context; 
     private PowerManager.WakeLock wakeLock; 
     protected ListenerAsync asyncListener = null; // This needs to be set from the parent activity 

     private LinearLayout linearLayout = (LinearLayout) findViewById(R.id.linear_layout); 

     protected ShowContent(Context context) { 
      this.context = context; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Let's make sure the CPU doesn't go to sleep 
      PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
      wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); 
      wakeLock.acquire(); 
     } 

     @SuppressLint("InflateParams") 
     @Override 
     protected Void doInBackground(String... passedInfo) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

      View categoryView; 
      View downloadView; 
      View seperatorView; 
      TextView textView = new TextView(context); 
      ImageButton imageButton = new ImageButton(context); 

      Cursor cursorMaterialGroups = tronDB.query(
       DBAdditionalMaterialGroups.TABLE_NAME, 
       DBAdditionalMaterialGroups.ALL_COLUMNS, 
       null, 
       null, 
       null, 
       null, 
       DBAdditionalMaterialGroups.COLUMN_ID + " ASC", 
       null); 

      while (cursorMaterialGroups.moveToNext()) { 
       // Create a group TextView by inflating a layout 
       categoryView = inflater.inflate(R.layout.additional_material_category, null); 
       textView = (TextView) categoryView; 
       textView.setText(cursorMaterialGroups.getString(cursorMaterialGroups.getColumnIndex(DBAdditionalMaterialGroups.COLUMN_NAME))); 

       publishProgress(textView); 

       // Now to get the downloads from the group 
       Cursor cursorMaterial = tronDB.query(DBAdditionalMaterial.TABLE_NAME, 
        DBAdditionalMaterial.ALL_COLUMNS, 
        DBAdditionalMaterial.COLUMN_GROUP + "=" + cursorMaterialGroups.getString(cursorMaterialGroups.getColumnIndex(DBAdditionalMaterialGroups.COLUMN_ID)), 
        null, 
        null, 
        null, 
        DBAdditionalMaterial.COLUMN_ID + " ASC", 
        null); 

       downloadCount += cursorMaterial.getCount(); 

       while (cursorMaterial.moveToNext()) { 
        downloadView = inflater.inflate(R.layout.additional_material_download, null); 
        // Download title 
        textView = (TextView) downloadView.findViewById(R.id.download_title); 
        textView.setText(cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_NAME))); 

        // Download/play button 
        imageButton = (ImageButton) downloadView.findViewById(R.id.download_button); 
        imageButton.setId(Integer.valueOf(cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_ID)))); 
        String fileName = null; 
        if (cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_TYPE)).equals("pdf")) { 
         fileName = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_ID)) + ".pdf"; 
        } 
        else { 
         fileName = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_ID)) + ".mp3"; 
        } 
        Drawable drawable = getResources().getDrawable(R.drawable.ic_action_play); 
        if (!files.fileExists(context, fileName)) { 
         if (firstDownloadAvailable == 0) { 
          firstDownloadAvailable = imageButton.getId(); 
         } 
         drawable = getResources().getDrawable(R.drawable.ic_action_save); 
         imageButton.setImageDrawable(drawable); 
         imageButton.setOnClickListener(new View.OnClickListener() { 
          public void onClick(View view) { 
           downloadId = view.getId(); 
           download(); 
          } 
         }); 
        } 
        else { 
         imageButton.setImageDrawable(drawable); 
         imageButton.setOnClickListener(new View.OnClickListener() { 
          public void onClick(View view) { 
           String contentId = String.valueOf(view.getId()); 
           openContent(contentId); 
          } 
         }); 
        } 

        publishProgress(downloadView); 

        if (!cursorMaterial.isLast()) { 
         seperatorView = inflater.inflate(R.layout.additional_material_seperator, null); 
         publishProgress(seperatorView); 
        } 
       } 

       cursorMaterial.close(); 
      } 

      // Other 
      categoryView = inflater.inflate(R.layout.additional_material_category, null); 
      textView = (TextView) categoryView; 
      textView.setText("OTHER"); 

      publishProgress(textView); 

      // Download all 

      downloadView = inflater.inflate(R.layout.additional_material_download, null); 
      // Download title 
      textView = (TextView) downloadView.findViewById(R.id.download_title); 
      textView.setText("Download all material"); 

      // Download/play button 
      imageButton = (ImageButton) downloadView.findViewById(R.id.download_button); 
      imageButton.setId(1); 
      Drawable drawable = getResources().getDrawable(R.drawable.ic_action_play); 
      drawable = getResources().getDrawable(R.drawable.ic_action_save); 
      imageButton.setImageDrawable(drawable); 
      imageButton.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
        downloadId = firstDownloadAvailable; 
        downloadAll = true; 
        download(); 
       } 
      }); 

      publishProgress(downloadView); 

      cursorMaterialGroups.close(); 

      return null; 
     } 

     @Override 
     protected void onProgressUpdate(View... view) { 
      linearLayout.addView(view[0]); 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      wakeLock.release(); 
      if (asyncListener != null) { 
       // Call the listener if one is set 
       asyncListener.onAsyncComplete(); 
      } 
     } 
    } 

    private void download() { 
     progress.show(this, this, true); 
     Files files = new Files(); 
     // Check if the memory card can be written to 
     if (files.isWriteable()) { 

      Cursor cursorMaterial = tronDB.query(DBAdditionalMaterial.TABLE_NAME, 
       DBAdditionalMaterial.ALL_COLUMNS, 
       DBAdditionalMaterial.COLUMN_ID + "=" + String.valueOf(downloadId), 
       null, 
       null, 
       null, 
       null, 
       "1"); 

      cursorMaterial.moveToFirst(); 
      String title = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_NAME)); 
      String type = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_TYPE)); 
      String url1 = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_URL1)); 
      String url2 = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_URL2)); 
      cursorMaterial.close(); 

      if (type.equals("pdf")) { 
       fileName = String.valueOf(downloadId) + ".pdf"; 
      } 
      else { 
       fileName = String.valueOf(downloadId) + ".mp3"; 
      } 

      // Change the message in the downloading prompt 
      progress.setMessage(getString(R.string.general_downloading) + " " + title); 

      SharedPreferences settings = getSharedPreferences(Settings.PREFERENCES, MODE_PRIVATE); 
      String rut = settings.getString(Settings.RUT, Settings.RUT_DEFAULT); 
      String url = url1 + rut + url2; 
      url = url.replace(" ", "%20"); 

      final Download download = files.new Download(this, fileName, progress); 
      download.downloadListener = this; 
      download.execute(url); 

      progress.setOnCancelListener(new DialogInterface.OnCancelListener() { 
       @Override 
       public void onCancel(DialogInterface dialog) { 
        downloadAll = false; 
        download.cancel(true); 
       } 
      }); 
     } 
     else { 
      progress.dismiss(); 
      Toast.makeText(this, getString(R.string.general_no_memory), Toast.LENGTH_SHORT).show(); 
     } 
    } 

    private void openContent(String contentId) {   
     Cursor cursorMaterial = tronDB.query(DBAdditionalMaterial.TABLE_NAME, 
      DBAdditionalMaterial.ALL_COLUMNS, 
      DBAdditionalMaterial.COLUMN_ID + "=" + contentId, 
      null, 
      null, 
      null, 
      null, 
      "1"); 

     cursorMaterial.moveToFirst(); 
     String type = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_TYPE)); 
     cursorMaterial.close(); 

     String fileName = ""; 
     String mimeType = ""; 

     if (type.equals("pdf")) { 
      fileName = contentId + ".pdf"; 
      mimeType = "application/pdf"; 
     } 
     else { 
      fileName = contentId + ".mp3"; 
      mimeType = "audio/mp3"; 
     } 

     files.openFile(this, fileName, mimeType); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent intent) { 
     super.onActivityResult(requestCode, resultCode, intent); 

     if (intent.getBooleanExtra(ConnectionFailed.RETRY, false)) { 
      // Failed, let's try the connection again 
      SharedPreferences settings = getSharedPreferences(Settings.PREFERENCES, MODE_PRIVATE); 
      String rut = settings.getString(Settings.RUT, Settings.RUT_DEFAULT); 
      String password = settings.getString(Settings.PASSWORD, Settings.PASSWORD_DEFAULT); 

      HashMap<String, String> postData = new HashMap<String, String>(); 
      postData.put("rut", rut); 
      postData.put("pass", password); 

      xmlParser = new XMLParser(this, postData); 
      xmlParser.fetchListener = this; // Tell the XMLParser that this activity has the listener 
      xmlParser.execute(MainActivity.URL + URL); 
     } 
    } 

    // This is the listener for the xml 
    public void onFetchComplete(String xml) { 
     if (xml == null) { 
      progress.dismiss(); 
      // Failed to fetch xml, either a server error or an internet connection problem 
      Intent intent = new Intent(this, ConnectionFailed.class); 
      startActivityForResult(intent, 1); 
     } 
     else { 
      HashMap<String, HashMap<String, String>> xmlHash = xmlParser.parseXML(xml); 
      new User().checkUserValidation(xmlHash.get("0")); 
      fetchFinished(xmlHash); 
     } 
    } 

    // This is the listener for the download 
    public void onDownloadComplete(boolean result) { 
     progress.dismiss(); 
     if (!result) { 
      Toast.makeText(this, getString(R.string.general_failed_download), Toast.LENGTH_LONG).show(); 
     } 
     else { 
      Toast.makeText(this, getString(R.string.general_download_complete), Toast.LENGTH_SHORT).show(); 
      Drawable drawable = getResources().getDrawable(R.drawable.ic_action_play); 
      ImageButton buttonView = (ImageButton) findViewById(downloadId); 
      buttonView.setImageDrawable(drawable); 
      buttonView.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { 
        String contentId = String.valueOf(view.getId()); 
        openContent(contentId); 
       } 
      }); 
      if (downloadAll) { 
       while (downloadCount >= downloadId) { 
        downloadId++; 
        Cursor cursorMaterial = tronDB.query(DBAdditionalMaterial.TABLE_NAME, 
         DBAdditionalMaterial.ALL_COLUMNS, 
         DBAdditionalMaterial.COLUMN_ID + "=" + String.valueOf(downloadId), 
         null, 
         null, 
         null, 
         null, 
         "1"); 

        cursorMaterial.moveToFirst(); 
        String type = cursorMaterial.getString(cursorMaterial.getColumnIndex(DBAdditionalMaterial.COLUMN_TYPE)); 
        cursorMaterial.close(); 

        if (type.equals("pdf")) { 
         fileName = String.valueOf(downloadId) + ".pdf"; 
        } 
        else { 
         fileName = String.valueOf(downloadId) + ".mp3"; 
        } 

        if (!files.fileExists(this, fileName)) { 
         download(); 
         break; 
        } 
       } 
       if (downloadCount == downloadId) { 
        // The last one downloaded we can now stop the process 
        downloadAll = false; 
       } 
      } 
     } 
    } 

    // This is the listener for the Async 
    public void onAsyncComplete() { 
     progress.dismiss(); 
    } 
} 

这里是我的进度条代码:

package cl.cromer.tronwell.concepcion; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.pm.ActivityInfo; 

public final class Progress { 

    protected ProgressDialog progressBar = null; 
    private int oldOrientation = -1; // Orientation not set 
    private Activity activity; 

    protected void show(Context context, Activity activity, boolean cancelable) { 
     this.activity = activity; 

     // Disable rotation while we are loading something 
     oldOrientation = activity.getRequestedOrientation(); 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); 

     if (progressBar != null && progressBar.isShowing()) { 
      activity.setRequestedOrientation(oldOrientation); 
      progressBar.dismiss(); 
     } 

     progressBar = new ProgressDialog(context); 
     progressBar.setCancelable(cancelable); 

     if (!cancelable) { 
      progressBar.setMessage(context.getString(R.string.general_loading)); 
      progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     } 
     else { 
      progressBar.setIndeterminate(true); 
      progressBar.setCanceledOnTouchOutside(false); 
      progressBar.setMessage(context.getString(R.string.general_downloading)); 
      progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
     } 
     progressBar.setProgress(0); 
     progressBar.setMax(100); 
     progressBar.show(); 
    } 

    protected void setMessage(String message) { 
     progressBar.setMessage(message); 
    } 

    protected void setIndeterminate(boolean indeterminate) { 
     progressBar.setIndeterminate(indeterminate); 
    } 

    protected void setProgress(int progress) { 
     progressBar.setProgress(progress); 
    } 

    protected void setOnCancelListener(DialogInterface.OnCancelListener listener) { 
     progressBar.setOnCancelListener(listener); 
    } 

    protected boolean isShowing() { 
     if (progressBar.isShowing()) { 
      return true; 
     } 
     return false; 
    } 

    protected void dismiss() { 
     // Turn rotation back to it's previous state 
     activity.setRequestedOrientation(oldOrientation); 
     if (progressBar != null && progressBar.isShowing()) { 
      progressBar.dismiss(); 
     } 
    } 
} 
+0

经过这一点,并做出相应的改变:HTTP://developer.android.com/guide/topics/resources/runtime-changes。 html – user3487063 2014-08-29 18:58:52

回答

1

检查这个问题的答案Answer

我想你面临同样的问题

检查这一项,以及Answer 2

+0

谢谢,答案2有我一直在寻找的一切。 – 2014-08-29 20:47:39