2012-03-22 5 views
1

Мое приложение выполняет некоторую сетевую активность или извлекает данные из веб-сервисов в фоновом потоке. Перед запуском открывается диалоговое окно прогресса. Диалог отклоняется на обработчике. Все это прекрасно работает, за исключением случаев, когда ориентация экрана меняется, когда диалог вверх. В этот момент мое приложение отключается. И im использует два макета для одного портрета в res/layout. Папка и один ландшафт в res/макет-земля. мое приложение получает сбой, когда я меняю ориентацию экрана с портрета на пейзаж или наоборот.Изменение ориентации экрана экрана при активном диалоге и фоновом потоке?

Я знаю, почему это происходит.

Когда я переключаю ориентации, Android создаст новый вид. Я, вероятно, получаю сбои, потому что \ background thread пытается изменить состояние на старом. (Может также возникнуть проблема, потому что фоновый поток не находится в потоке пользовательского интерфейса). Так может кто-нибудь приятель сказать мне, как решить это, чтобы я мог продолжить.

Как я могу обрабатывать изменение ориентации экрана, когда диалог выполнения и фоновый поток активны?

Заранее спасибо.

мой код здесь

public class LoginActivity extends Activity { 

EditText edUserName, edPassword; 
Button btnLogin; 
TextView txt_Alert; 
ProgressDialog dialog; 
String url, Status, result; 
ConnectToWebService cn; 

final Handler handler = new Handler() { 

    @Override 
    public void handleMessage(Message msg) { 

     super.handleMessage(msg); 

     dialog.dismiss(); 
     if (check_Status()) { 
      login(); 
     } 

    } 

}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setTitle("Login"); 
    edUserName = (EditText) findViewById(R.id.edName); 
    edPassword = (EditText) findViewById(R.id.edPass); 
    btnLogin = (Button) findViewById(R.id.btnLogin); 
    txt_Alert = (TextView) findViewById(R.id.txt_Required); 



    btnLogin.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 

      String uName = edUserName.getText().toString().trim(); 
      String Pass = edPassword.getText().toString(); 

      cn = new ConnectToWebService(); 
      processThread(); 

} 


protected void processThread() { 
    dialog = ProgressDialog.show(LoginActivity.this, "", 
      "Singing in ...", false); 

    new Thread() { 

     public void run() { 


      Status = cn.callWebService(url); 
      handler.sendEmptyMessage(0); 

     } 

    }.start(); 

} 

Мой LogCat

03-23 00:03:48.865: E/AndroidRuntime(11799): java.lang.IllegalArgumentException: View not attached to window manager 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:200) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.view.Window$LocalWindowManager.removeView(Window.java:432) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.app.Dialog.dismissDialog(Dialog.java:278) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.app.Dialog.access$000(Dialog.java:71) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.app.Dialog$1.run(Dialog.java:111) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.app.Dialog.dismiss(Dialog.java:268) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at com.palewar.coinop.LoginActivity$1.handleMessage(LoginActivity.java:42) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.os.Looper.loop(Looper.java:130) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at java.lang.reflect.Method.invokeNative(Native Method) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at java.lang.reflect.Method.invoke(Method.java:507) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:861) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:619) 
03-23 00:03:48.865: E/AndroidRuntime(11799): at dalvik.system.NativeStart.main(Native Method) 

ответ

0

Вместо того, чтобы с помощью ProgressDialog непосредственно переопределить функцию OnCreateDialog своей деятельности в. Или я считаю, что вы можете установить, какую роль играет родитель диалога.

http://developer.android.com/reference/android/app/Activity.html#onCreateDialog(int, android.os.Bundle)

Это должно сохранить диалог позволяет отклонить его с помощью своей деятельности по dismissDialog вызова

0

НШ ,,

Чтобы наилучшим образом оптимизировать вы должны использовать:

1.Используйте ориентацию Activity для некоторых, скажем, портрета или ландшафта, если это не требуется в вашем случае.

2.Используйте onOrientationChange() и тщательно обработайте события. Когда вы создаете диалог выполнения, чтобы показывать, но если окно управления ориентацией меняется в действии, и вид не существует, на котором выполняется действие (например, показано диалоговое окно событие)

3.Simple решение, но не хорошо, чтобы иметь

wihtin try 
{ 
processThread(); 
/**basically this line dialog = ProgressDialog.show(LoginActivity.this, "", 
      "Singing in to CoinOp...", false);*/ 
} 
catch (Exception e); 
2

Я найти решение для моей проблемы и сделать это как этот

package com.palewar; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 

public class ThreadActivity extends Activity { 


    static ProgressDialog dialog; 
    private Thread downloadThread; 
    final static Handler handler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 

      super.handleMessage(msg); 

      dialog.dismiss(); 

     } 

    }; 

    protected void onDestroy() { 
     if (dialog != null && dialog.isShowing()) { 
      dialog.dismiss(); 
      dialog = null; 
     } 
     super.onDestroy(); 
    } 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     downloadThread = (Thread) getLastNonConfigurationInstance(); 
     if (downloadThread != null && downloadThread.isAlive()) { 
      dialog = ProgressDialog.show(ThreadActivity.this, "", 
        "Signing in...", false); 
     } 

     dialog = ProgressDialog.show(ThreadActivity.this, "", 
       "Signing in ...", false); 

     downloadThread = new MyThread(); 
     downloadThread.start(); 
     // processThread(); 
    } 

    // Save the thread 
    @Override 
    public Object onRetainNonConfigurationInstance() { 
     return downloadThread; 
    } 


    static public class MyThread extends Thread { 
     @Override 
     public void run() { 

      try { 
       // Simulate a slow network 
       try { 
        new Thread().sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       handler.sendEmptyMessage(0); 

      } finally { 

      } 
     } 
    } 

} 

Дайте мне знать, что это работает для вас всех наших не

+0

ya, Это тоже работает для меня. Причина в том, что мы Portrait или LandScape Device при отображении ProgressBar, то тогда будет вызван метод onDestroy(). – String

Смежные вопросы