2012-02-17 10 views
0

私はアンドロイドの初心者ですし、GUIの作業のための簡単な更新を得るために多くの問題があります。私のメインクラスから UIを更新するサブスレッドAsyncTaskからメインスレッド

iはAsyncTaskを呼び出す:

02-08 06:19:01.857: W/System.err(5625): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
    02-08 06:19:01.887: W/System.err(5625):  at android.view.ViewRoot.checkThread(ViewRoot.java:2932) 
    02-08 06:19:01.897: W/System.err(5625):  at android.view.ViewRoot.requestLayout(ViewRoot.java:629) 
    02-08 06:19:01.917: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:01.927: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:01.947: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:01.957: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:01.977: W/System.err(5625):  at android.widget.AbsListView.requestLayout(AbsListView.java:1102) 
    02-08 06:19:01.997: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:02.007: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:02.030: W/System.err(5625):  at android.widget.TableLayout.requestLayout(TableLayout.java:226) 
    02-08 06:19:02.037: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:02.057: W/System.err(5625):  at android.view.View.requestLayout(View.java:8267) 
    02-08 06:19:02.068: W/System.err(5625):  at android.widget.TextView.checkForRelayout(TextView.java:5521) 
    02-08 06:19:02.087: W/System.err(5625):  at android.widget.TextView.setText(TextView.java:2724) 
    02-08 06:19:02.097: W/System.err(5625):  at android.widget.TextView.setText(TextView.java:2592) 
    02-08 06:19:02.107: W/System.err(5625):  at android.widget.TextView.setText(TextView.java:2567) 
    02-08 06:19:02.127: W/System.err(5625):  at com.hdit.RepeatTimerTask.doInBackground(RepeatTimerTask.java:74) 
    02-08 06:19:02.147: W/System.err(5625):  at com.hdit.RepeatTimerTask.doInBackground(RepeatTimerTask.java:1) 
    02-08 06:19:02.159: W/System.err(5625):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
    02-08 06:19:02.177: W/System.err(5625):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
    02-08 06:19:02.187: W/System.err(5625):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    02-08 06:19:02.207: W/System.err(5625):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
    02-08 06:19:02.217: W/System.err(5625):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
    02-08 06:19:02.237: W/System.err(5625):  at java.lang.Thread.run(Thread.java:1019) 
:私はのTextViewを更新しようとすると、私はエラーを取得する

class RepeatTimerTask extends AsyncTask<Void, String, Void> { 
private long startTime; 
private TextView txtToUpdate; 
private Handler mHandler = new Handler(); 
long mStartTime = 0; 
RepeatTimer timer; 
long timerLength = 0; 

public RepeatTimerTask(TextView txtToUpdate, RepeatTimer timer) { 
    this.txtToUpdate = txtToUpdate; 
    this.timer = timer; 
    startTime = new Date().getTime(); 
    this.timerLength = timer.getTime() * 1000; 
} 




protected void onProgressUpdate(String newText) { 
    try 
    { 

     txtToUpdate.setText(newText); 
     txtToUpdate.invalidate(); 
    }catch (Exception e) { 
     HErrorHandler.log(e); 
    } 
} 

protected void onPostExecute() { 
    txtToUpdate.setText("ALAAAAAMMMM"); 
} 

@Override 
protected Void doInBackground(Void... params) { 

    while (true) { 
     try { 
      synchronized (this) { 
       this.wait(100); 
      } 
     } catch (InterruptedException e) { 
      HErrorHandler.log(e); 
      break; 
     } 

     long millis = System.currentTimeMillis() - startTime; 
     if (millis <= 0 
       || System.currentTimeMillis() > timerLength + startTime) { 
      break; 
     } 
     int seconds = (int) (millis/1000); 
     int minutes = seconds/60; 
     seconds = seconds % 60; 

     // !!!!!!!!!!!!!!!!!! HERE THE ERROR1 OCCOURS!!!!!!! 
     //txtToUpdate.setText(String.format("%d:%02d", minutes, seconds)); 
     //txtToUpdate.invalidate(); 
     String labelText = String.format("%d:%02d", minutes, seconds); 
     publishProgress(labelText); 
    } 
    return null; 
} 


} 

を次のように

RepeatTimerTask task = new RepeatTimerTask(text, timerDummy); 
task.execute(null); 

非同期クラスがあります

これを避けるにはどうすればよいですか?

残念ながら

onProgressUpdate

は到達しません。

ありがとうございます

+0

私はあなたがやろうとしているものに関して、少し混乱しています見てください - あなたはあなたのバックグラウンドスレッドが実行されているよう進捗ダイアログを更新しようとしている - または後にテキストビューを更新します仕事は終わった? – harmanjd

+0

私のbackgroundthreadが実行されている間にラベルを更新しようとしました。 – elCapitano

+0

メイン以外のスレッドでタスクを作成していますか? – AedonEtLIRA

答えて

1

あなたの問題はコメントアウトされたコードから発生します。 できませんメインスレッド外のビューを更新します。タスク(独自のビューで実行)のテキストビューを無効にしています。問題を解消するには、soInBackgroundではなく、onProgressUpdateでテキストビューを更新する必要があります。

@Override 
protected void onProgressUpdate(String... values) 

感謝をとにかく:

+0

問題は、onProgressUpdateに決して達していないことです! – elCapitano

+0

doInBackgroundでビューを更新しようとしているためです。あなたは、ビュー、setText()、またはメインスレッドではないスレッドでUIと関係があるものは更新できません**。タスクを開始する前、onProgressUpdate中、またはafterのいずれかにテキストを設定する必要があります。 – AedonEtLIRA

+0

申し訳ありませんが、それはそれとは関係ありません...エラーが発生したので、私はそれをコメントアウトしました。私は今問題を解決しました。私はonProgressUpdateと署名のいくつかの事柄について "上書き"という言葉を忘れていました。 – elCapitano

1

ソリューションは、正しくonProgressUpdateを書き換えてすることでした。

関連する問題