【问题标题】:Android - java.lang.RuntimeException: Could not read input channel file descriptors from parcelAndroid - java.lang.RuntimeException:无法从包裹中读取输入通道文件描述符
【发布时间】:2016-02-05 06:11:19
【问题描述】:

我在运行应用程序时遇到 FATAL EXCEPTION: main。它先运行,但几秒钟后它崩溃了。

这是我的 Logcat:

java.lang.RuntimeException: Could not read input channel file descriptors from parcel.
                                                 at android.view.InputChannel.nativeReadFromParcel(Native Method)
                                                 at android.view.InputChannel.readFromParcel(InputChannel.java:148)
                                                 at android.view.IWindowSession$Stub$Proxy.addToDisplay(IWindowSession.java:752)
                                                 at android.view.ViewRootImpl.setView(ViewRootImpl.java:527)
                                                 at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:282)
                                                 at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
                                                 at android.app.Dialog.show(Dialog.java:298)
                                                 at android.app.AlertDialog$Builder.show(AlertDialog.java:993)
                                                 at com.mobext.shakeys.ActivityMain$ProcessData.onPostExecute(ActivityMain.java:545)
                                                 at com.mobext.shakeys.ActivityMain$ProcessData.onPostExecute(ActivityMain.java:212)
                                                 at android.os.AsyncTask.finish(AsyncTask.java:636)
                                                 at android.os.AsyncTask.access$500(AsyncTask.java:177)
                                                 at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                 at android.os.Looper.loop(Looper.java:135)
                                                 at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                 at java.lang.reflect.Method.invoke(Method.java:372)
                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

在我的 ActivityMain.java:542 中的 alrt.show() 这是 logcat 指向它的位置:

@Override
    protected void onPostExecute(Boolean result) {
        Log.i(TAG, "onPostExecute");
        super.onPostExecute(result);
        if(result){

            Log.i(TAG, "TASK IS DONE");
            try {
                PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
                app.saveToLastPref(ActivityMain.this, app.PREFS_PREV_VERSION, pInfo.versionName);
            } catch (NameNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Intent intent = new Intent(getApplicationContext(), ActivityMenuPage.class);
            startActivity(intent);
            finish();
        }else{
            ActivityMain.this.deleteDatabase("DBSHAKEYS");
            Builder alrt = new AlertDialog.Builder(mcontext);
            alrt.setMessage("Update failed. Please check your internet connection and try again.");
            alrt.setPositiveButton("Okay", new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    finish();
                }
            });
            alrt.show();
        }
    }

}

在 ActivityMain.java:212 中:

public class ProcessData extends AsyncTask<Void, Void, Boolean> 

【问题讨论】:

  • 在调用alrt.show() 方法之前,您可能已经显示了一些AlertDialog。你检查正确了吗? Builder 是你的自定义类吗?

标签: java android android-studio


【解决方案1】:

我认为Builder 是您现在用来显示AlertDialog 的自定义类。

以下是可能发生的情况

onPostExecute() 方法是在您的某个后台进程执行完毕后自动调用的。然后它尝试使用可能正在被另一个进程使用并且仍在内存中运行的 Builder 类。

那怎么解决呢?

  1. 查看您的代码并查看对话框是否已显示使用 生成器类。
  2. 只需更改此行 Builder alrt = new AlertDialog.Builder(mcontext); 到通常AlertDialog.Builder alrt = new AlertDialog.Builder(mcontext); 看看这是否有效。

【讨论】:

  • @RussVirtuoso 你的 mContext 是什么?这是您的活动,例如MyActivity.this 还是其他?
  • @RussVirtuoso 只需使用AlertDialog.Builder alrt = new AlertDialog.Builder(MyActivity.this); 调试您的应用程序。这应该有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 2015-11-01
  • 2011-08-16
  • 2016-05-08
  • 2011-10-02
  • 2017-02-12
  • 1970-01-01
相关资源
最近更新 更多