【问题标题】:Changing adapter values in Gridview cause an exception在 Gridview 中更改适配器值会导致异常
【发布时间】:2013-05-03 12:00:14
【问题描述】:

我正在使用 Gridview 在内部显示一些 TextView。我创建了一个清除按钮,它设置了一个带有空 ArrayList 的新适配器,它工作正常。当我试图在另一个地方执行相同的操作时,会发生异常。我已经跟踪了我所有的代码,直到我指出了导致问题的语句。

在类的第一个声明gridview

GridView gridView; 

在 OnCreate 方法中获得了引用

gridView = (GridView) findViewById(R.id.gridView1);

创建适配器

String[] arrayEmpty = new String[] {"", "", "", "", "", "", "", "", ""};
ArrayList<String> list = new ArrayList<String>(Arrays.asList(arrayEmpty));
gridView.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item,list));//list_item is acustomized layout for the TextView

我在 Clear() 方法中所做的并且工作正常:

gridView.setAdapter(new ArrayAdapter<String>(MainActivity.this,R.layout.list_item,listEmpty));

我正在做什么来设置值并且不起作用:

   ArrayList<String> gridList= new ArrayList<String>();

    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            gridList.add(String.valueOf(e[i][j].getValue()));
        }
    }
//The next statement cause an Exception..Why!!?
    gridView.setAdapter(new ArrayAdapter<String>(MainActivity.this,R.layout.list_item,gridList));

class solveTask extends AsyncTask<Object, Void, String> { 

    @Override
      protected void onPreExecute() {
        ProgressDialog pd = new ProgressDialog(MainActivity.this);
        pd.setProgress(ProgressDialog.STYLE_SPINNER);
        pd.setMessage("Solving, please wait a few seconds...");
        pd.setIndeterminate(true);
        pd.setCancelable(false);
        pd.show();
      }

    @Override
    protected String doInBackground(Object... parametros) {

        MainActivity.this.runOnUiThread(new Runnable() {
          public void run() {
             fillSudoku();
             solve();
          }
       });
       return null; 
    }


        @Override
        protected void onPostExecute(String result)
        {    //update progressDialog here
            pd.dismiss();
        }
    }

部分日志:

04-27 10:24:04.556: W/dalvikvm(7823): threadid=9: 线程退出 未捕获的异常(组=0x40015560)04-27 10:24:04.586: E/AndroidRuntime(7823):致命异常:AsyncTask #1 04-27 10:24:04.586: E/AndroidRuntime(7823): java.lang.RuntimeException: An 执行 doInBackground() 04-27 10:24:04.586 时发生错误: E/AndroidRuntime(7823):在 android.os.AsyncTask$3.done(AsyncTask.java:200) 04-27 10:24:04.586: E/AndroidRuntime(7823):在 java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 java.util.concurrent.FutureTask.setException(FutureTask.java:125) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 java.util.concurrent.FutureTask.run(FutureTask.java:138) 04-27 10:24:04.586:E/AndroidRuntime(7823):在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 java.lang.Thread.run(Thread.java:1019) 04-27 10:24:04.586: E/AndroidRuntime(7823):由以下原因引起: java.lang.UnsupportedOperationException:removeAllViews() 不是 在 AdapterView 04-27 10:24:04.586 中支持:E/AndroidRuntime(7823): 在 android.widget.AdapterView.removeAllViews(AdapterView.java:511) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 com.etaworx.thesudokusolver.MainActivity.printSudoku(MainActivity.java:481) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 com.etaworx.thesudokusolver.MainActivity.solve(MainActivity.java:579) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 com.etaworx.thesudokusolver.MainActivity$solveTask.doInBackground(MainActivity.java:625) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 com.etaworx.thesudokusolver.MainActivity$solveTask.doInBackground(MainActivity.java:1) 04-27 10:24:04.586: E/AndroidRuntime(7823): 在 android.os.AsyncTask$2.call(AsyncTask.java:185) 04-27 10:24:04.586: E/AndroidRuntime(7823):在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 04-27 10:24:04.586: E/AndroidRuntime(7823): ... 4 更多 04-27 10:24:09.849:E/WindowManager(7823):活动 com.etaworx.thesudokusolver.MainActivity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@4054e258 那 最初添加在这里 04-27 10:24:09.849: E/WindowManager(7823): android.view.WindowLeaked:活动 com.etaworx.thesudokusolver.MainActivity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView@4054e258 那 最初添加在这里 04-27 10:24:09.849: E/WindowManager(7823): 在 android.view.ViewRoot.(ViewRoot.java:258) 04-27 10:24:09.849:E/WindowManager(7823):在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 04-27 10:24:09.849: E/WindowManager(7823): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 04-27 10:24:09.849: E/WindowManager(7823): 在 android.view.Window$LocalWindowManager.addView(Window.java:424) 04-27 10:24:09.849:E/WindowManager(7823):在 android.app.Dialog.show(Dialog.java:241) 04-27 10:24:09.849: E/窗口管理器(7823):在 com.etaworx.thesudokusolver.MainActivity.showLoading(MainActivity.java:570) 04-27 10:24:09.849: E/WindowManager(7823): 在 com.etaworx.thesudokusolver.MainActivity$2.onClick(MainActivity.java:77) 04-27 10:24:09.849: E/WindowManager(7823): 在 android.view.View.performClick(View.java:2485) 04-27 10:24:09.849: E/窗口管理器(7823):在 android.view.View$PerformClick.run(View.java:9080) 04-27 10:24:09.849: E/窗口管理器(7823):在 android.os.Handler.handleCallback(Handler.java:587) 04-27 10:24:09.849:E/WindowManager(7823):在 android.os.Handler.dispatchMessage(Handler.java:92) 04-27 10:24:09.849:E/WindowManager(7823):在 android.os.Looper.loop(Looper.java:123) 04-27 10:24:09.849: E/窗口管理器(7823):在 android.app.ActivityThread.main(ActivityThread.java:3683) 04-27 10:24:09.849:E/WindowManager(7823):在 java.lang.reflect.Method.invokeNative(Native Method) 04-27 10:24:09.849:E/WindowManager(7823):在 java.lang.reflect.Method.invoke(Method.java:507) 04-27 10:24:09.849: E/窗口管理器(7823):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 04-27 10:24:09.849: E/WindowManager(7823): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 04-27 10:24:09.849:E/WindowManager(7823):在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我想你忘了发布你的堆栈跟踪。
  • @Ascorbin .. 对不起,堆栈跟踪是什么?
  • 你得到的 LogCat 输出,它将包含对异常的描述。假设您使用 Eclipse,您的 DDMS 视图/logcat 窗口中会有很多红色文本。
  • 我应该全部复制粘贴吗? @Ascorbin
  • 它表明您在代码中使用了 AsyncTask,同时发布该代码。这将显示问题出在哪里。

标签: android android-gridview


【解决方案1】:

我认为solve(); 函数在主线程上运行,doinbackground() 在后台线程上运行。像这样改变你的solve()函数

@Override
protected String doInBackground(Object... parametros) {
   this.runOnUiThread(new Runnable() {
      public void run() {
         solve();
      }
   });
   return null; 
}

【讨论】:

  • 我应该用您的代码替换语句 Solve 吗?我认为你是对的,因为在主线程中声明的一些参数在solve();中是空的……这段代码到底做了什么?
  • 是的,更改您的 doinbackground 中的代码。现在看看我的回答。
  • 但是,这里有个问题。我正在调用 AsyncTask 以便能够显示 ProgressDialog 但是,现在在 UIThread 中使 solve() 工作后,progressDialog 消失了。我该怎么办?
  • 我是先,在mainThread中调用一个方法显示ProgressDialog,然后调用solveTask().execute();并在 postExecution() 中将其关闭
  • 在 asynctask() 的 preExecution() 中显示 ProgressDialog。并隐藏在 postExecution() 中
【解决方案2】:

异步任务

  • onPreExecute - 在 UI 线程上调用,在此处显示 progressDialog
  • doInBackground() - 在 onPreExecute 之后立即调用。通常会启动新线程并在此处执行长时间操作,例如网络点击
  • onPostExecute() - 在 UI 线程中的后台线程执行后立即调用,在此处关闭 progressDialog

所以避免在 doInBackground() 中的 UI 线程上执行。 Link

您的日志显示 AdatpterView 上 removeAllViews 的异常,请检查此异常,以下链接可能对您有用

Link1, Link2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-16
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多