2016-10-31 16 views
-2

リストビューに値1〜10を表示させたいだけです。しかし、アイテムがリストビューに追加されるたびに250ミリ秒間スリープすることで、一時停止を「シミュレート」したいと考えています。問題は、Thread.sleep()を呼び出すと実行時にクラッシュするということです。最初の項目(番号1)は正常に表示されますが、その後はクラッシュします。私のプログラムがクラッシュする理由についての提案? UIを変更した後にThread.sleep()を呼び出すと、ランタイムエラーが発生するように思われる

私はのThread.sleepを(コメントアウト場合

が)、これは、クラッシュを引き起こしThread.sleep()ではありません

class Read extends AsyncTask<Void, Integer, Void> { 
    ArrayAdapter<String> adpt; 
    File file; 
    Scanner scan; 

    Read(ArrayAdapter<String> a, File f) { 
     adpt = a; 
     file = f; 
     try { 
      scan = new Scanner(file); 
     } 
     catch (IOException e) { 
      Toast.makeText(MainActivity.this, "Error reading file!", Toast.LENGTH_SHORT).show(); 
      // I should do something... just not sure what. 
     } 
    } 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     Integer i = 0; 
     // Toast.makeText(MainActivity.this, "Error reading file!", Toast.LENGTH_SHORT).show(); 
     adpt.setNotifyOnChange(false); 
     while (scan.hasNext()) { 
      String j = scan.next(); 
      adpt.add("dead"); 
      i++; 
      try { 
       Thread.sleep(250); 
      } 
      catch (InterruptedException e) { 
      } 
      publishProgress(i); 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... values) { 
     adpt.notifyDataSetChanged(); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     scan.close(); 
     adpt.notifyDataSetChanged(); 
    } 
} 

エラーログ

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
        Process: com.example.multithread, PID: 4314 
        java.lang.RuntimeException: An error occurred while executing doInBackground() 
         at android.os.AsyncTask$3.done(AsyncTask.java:318) 
         at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
         at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
         at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
         at java.lang.Thread.run(Thread.java:761) 
        Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
         at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6855) 
         at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1040) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360) 
         at android.view.View.requestLayout(View.java:19655) 
         at android.widget.AbsListView.requestLayout(AbsListView.java:1988) 
         at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:840) 
         at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6357) 
         at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) 
         at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50) 
         at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:310) 
         at android.widget.ArrayAdapter.add(ArrayAdapter.java:200) 
         at com.example.multithread.MainActivity$Read.doInBackground(MainActivity.java:70) 
         at com.example.multithread.MainActivity$Read.doInBackground(MainActivity.java:39) 
         at android.os.AsyncTask$2.call(AsyncTask.java:304) 
         at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)  
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)  
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)  
         at java.lang.Thread.run(Thread.java:761)  
Application terminated. 
+1

エラーメッセージが表示されます。私はそれがnullpointereceptionであると思った。あなたのコメント "//コンストラクタで設定"が正しいと仮定すると、それは理由ではないかもしれません。ただし、ヘルプセンターにアクセスして「質問する方法」を読んでから、質問に必要な情報を追加してください。 – GhostCat

+0

コンストラクタも追加します。どこに尋ねるセクション " – Cameron

+1

エラーログを追加します。 – Nitesh

答えて

1

に動作します。 logcatに見られるように、非UIスレッドのUIコンポーネントadptを変更しようとしています。

adpt.add()コールは、 onProgressUpdate()を実行してUIスレッドで実行させます。

+0

本当にありがとうございました:)申し訳ありませんが、以前はlogcatに注意を払っていませんでした。 – Cameron

関連する問題