0

アンドロイドSOLUTION:他のスレッドは私にアクティビティレイアウトを変更させません!

それが最善か、きれいな解決策ではないかもしれませんが、それは動作します。新しいスレッドを開始して、新しいスレッドがメインスレッドに新しい実行可能プログラムを取得、割り当て、中断して、ビューを開始する間に、メインスレッドがProgressDialogを表示できるようにします。 ProgressDialogを新しいスレッドのすべてのアクティビティが実行されている間に表示するには、前述のようにProgressDialogをメインスレッドで開始し、もちろん新しいスレッドの最後に終了する必要があります。 ProgressDialogは、新しいスレッドが始まる直前に開始されなければならず、待つ必要があるのは新しいスレッドに入る必要があります。また、ProgressDialogを待っている間にUIの変更を行いたい場合は、メインスレッドを新しい実行可能ファイルで中断する必要があります。run()メソッドの変更をrunOnUiThreadで行います。

public void onCreate(Bundle savedInstanceState) { 
       ... 

       ((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null)); 

       ((TextView) findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString()); 

       final ProgressDialog progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 

       new Thread(new Runnable() { 
        protected void run() { 
         ... //get some data, fill some lists and assign some variables... 

         runOnUiThread(new Runnable() { 
              public void run() { 
               initiateActivity(); 
              } 
             }); 

         progressDialog.dismiss(); 

         return true; 
        } 
       }).start(); 
} 

オリジナルのポスト:読書のための

こんにちはすべて、多くの感謝。 :)

メインUIスレッドとは別のスレッドからアクティビティレイアウトを変更することは本当に不可能ですか?

ProgressDialogの実行中に別のスレッドからテーブルにデータを書き込もうとしています。このような。

public void onCreate(Bundle savedInstanceState) { 
       ... 

       ((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null)); 

       ((TextView)findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString()); 

       new Thread(new Runnable() { 
        public void run() { 
          ... //get some data, fill some lists and assign some variables... 

         initiateActivity(); 
        } 
       }).start(); 

       progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 
} 

private void initiateActivity() { 
    fillOrderTable(); 
    initiateGestureview(); 
    fillCustServiceForCustomer(); 

    progressDialog.dismiss(); 
} 

しかし、すぐに私は何を変更するか、私は例外を取得テーブルにデータを追加始めると「アクティビティcustomerapp.customercentral.Overviewが漏れた窓[email protected]こともともと。ここ

を添加し、そして、彼らが私の活動の他の部分から再利用されているので、私は本当にたくはスレッド内のinitationメソッドを移動しないでください。

これに対する解決策はありますか?

ビッグありがとう!:)

EDIT:

はこれを試みたが、その後、ProgressDialogが表示されません...

public void onCreate(Bundle savedInstanceState) { 
       ... 

       ((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null)); 

       ((TextView)findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString()); 

       new Thread(new Runnable() { 
        public void run() { 
         runOnUiThread(new Runnable() { 
          public void run() { 
           ... //get some data, fill some lists and assign some variables... 

           initiateActivity(); 
          } 
         }); 
        } 
       }).start(); 

       progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 
} 

同じことが、このために行く...

public void onCreate(Bundle savedInstanceState) { 
       ... 

       ((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null)); 

       ((TextView)findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString()); 

       new AsyncTask<Boolean, Boolean, Boolean>() { 
        protected void onPreExecute() { 
         progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 
        } 

        protected Boolean doInBackground(Boolean... unused) { 
         runOnUiThread(new Runnable() { 
          public void run() { 
           ... //get some data, fill some lists and assign some variables... 

           initiateActivity(); 
          } 
         }); 

         return true; 
        } 

        protected void onPostExecute(Boolean unused) { 
         progressDialog.dismiss(); 
        } 
       }).execute(true); 
} 
+0

本当にスレッドに何かをさせたい場合は、ハンドラを使用できます。しかし要するに、UIスレッドだけがUIに触れることができます。 –

答えて

0

SOLUTION:

それは最高やきれいな解決策ではないかもしれませんが、それは動作します。新しいスレッドを開始して、新しいスレッドがメインスレッドに新しい実行可能プログラムを取得、割り当て、中断して、ビューを開始する間に、メインスレッドがProgressDialogを表示できるようにします。 ProgressDialogを新しいスレッドのすべてのアクティビティが実行されている間に表示するには、前述のようにProgressDialogをメインスレッドで開始し、もちろん新しいスレッドの最後に終了する必要があります。 ProgressDialogは、新しいスレッドが始まる直前に開始されなければならず、待つ必要があるのは新しいスレッドに入る必要があります。また、ProgressDialogを待っている間にUIの変更を行いたい場合は、メインスレッドを新しい実行可能ファイルで中断する必要があります。run()メソッドの変更をrunOnUiThreadで行います。

public void onCreate(Bundle savedInstanceState) { 
       ... 

       ((ScrollView) findViewById(R.id.contentContainer)).addView(getLayoutInflater().inflate(R.layout.myCustomContentLayout, null)); 

       ((TextView) findViewById(R.id.name)).setText(customer.getProperty("name").getValue().toString()); 

       final ProgressDialog progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 

       new Thread(new Runnable() { 
        protected void run() { 
         ... //get some data, fill some lists and assign some variables... 

         runOnUiThread(new Runnable() { 
              public void run() { 
               initiateActivity(); 
              } 
             }); 

         progressDialog.dismiss(); 

         return true; 
        } 
       }).start(); 
} 
0

あなたがすることはできません他のスレッドからUIを変更する... UIを変更するには、「ru​​nOnUiThread」を使用するか、ハンドラを使用して変更する必要があります。 try this ... アクティビティを実行可能にする

public class myclass extends Activity implements Runnable{ 
public void onCreate(Bundle savedInstanceState) { 
...... 
progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 
Thread thread = new Thread(this); 
      thread.start(); 
} 
public void run() { 
      fillOrderTable(); 
      initiateGestureview(); 
      fillCustServiceForCustomer(); 
      handler.sendEmptyMessage(0); 
    } 
private Handler handler = new Handler() { 
      @Override 
      public void handleMessage(Message msg) { 
        progressDialog.dismiss(); 


      } 
    }; 
} 
+0

わかりましたが、私はAndroidプラットフォーム用のアプリを開発するのにはかなり新しいです。どのように私がこれを行うことができるか、私に良い例を教えてくれるかの例を私に教えてください。もちろん私は自分自身も探しています。どうもありがとう。 :) –

+0

thats all ..この "runonuithread"をスレッドの "run()"メソッドの中に入れてください。このコード部分でUiに変更を加えることができます – 5hssba

+0

ありがとう。これを試してみましたが、何らかの理由でProgressDialogが早すぎると解消されます。 : - | –

2

いいえいいえ、別のスレッドからUIを変更することはできません。 UIに触れないタスクがある場合、AsynchTaskを使用してそれらをバックグラウンドで実行し、タスクが完了したときにメインスレッドで通知されます。 しかし、スレッドを修正する必要がある場合は、メインスレッドで行う必要があります。あなたのコードがどこか別の場所であり、あなたがUI

public void onCreate(Bundle savedInstanceState) { 
    ... 
progressDialog = ProgressDialog.show(this, "Loading", "Please wait..."); 
initiateActivity(); 
progressDialog.dismiss(); 

} 

private void initiateActivity() { 
    fillOrderTable(); 
    initiateGestureview(); 
    fillCustServiceForCustomer(); 
} 

EDIT

それについて考えを変えるのコードを実行するrunOnUIThreadを使用することができ、他のスレッドで使用されている場合 は:違いは、あなたが必要だということですonCreateを終了するには、メインスレッドにアタッチしているスレッドを実行するとどうなりますか。そのため、上記のソリューションは、あなたのソリューションと同等ではありません。

+0

実際には、私が本当に必要とするのは、 'initiateActivity'が実行中である間にProgressDialogを表示することです。これは、テーブルをデータで満たすメソッドです。 –

+0

その場合、AsynchTaskを使用してください。あなたは進捗を開始し、タスクが完了したときにそれを閉じますが、バックグラウンドのステップではuiにアクセスしません – kingston

+0

コードをチェックしましたスレッドを実行するのは意味がないと思うのは、メインスレッドは何かを行う – kingston

0

開始他のスレッドからレイアウトを変更することは可能ですが、すべてのジョブはUIスレッドで実行する必要があります。これを行うには、Activity.runOnUiThread()View.post()View.postDelayed()の方法を使用するか、Handlerを使用できます。

記事Painless Threadingには、このタスクに関する詳細が含まれています。

+0

オリジナルの投稿の上に私のソリューションをチェックしてください。 :) –

+0

@ Hessi-Dude AsyncTaskスレッドでは何もしないので、AsyncTaskは絶対に冗長です。あなたは 'onPreExecute'と' onPostExecute'にある全てのコードをRunnableに入れて、 'runOnUiThread'と同じ効果で実行することができます。あなたがスレッドでいくつかの作業を行うつもりなら、あなたはそれを正しく実行しません。 'onProgressUpdate'を実装し、代わりに' publishProgress() 'を呼び出す必要があります。もう一つのことは、質問に解決策を加えるべきではありません。自分で解決策を考え出す場合は、回答として残し、それを合格とマークします。 – Malcolm

+0

はい、あなたは正しいです...私はAsyncTaskを試していたので、AsyncTaskを使っていたのです。前に自分の投稿に答えることができませんでした...評判のポイントが足りませんでした。 :) –

関連する問題