2011-11-13 8 views
0

私はAndroidプラットフォームの初心者であり、重大な問題に遭遇しています。私はGmailから電子メールを取得したいので、私はそれを行うクラスを作成しました。しかし、私はアンドロイドNetworkOnMainThreadExceptionで自分のクラスを実行するとき。だから私は、以下のような新しいRunnableを持つ新しいスレッドを作成しました:Androidのスレッド(JavamailのNetworkOnMainThreadException)が非常に奇妙な動作

public void onClick(View v) { 
    new Thread(new Runnable() { 
    public void run() { 
     FetchEmails e = new FetchEmails(); 
    } 
    }).start(); 
} 

それがうまく働いたが、その後、私は実際の電子メールを取得するためにe.getMessageへのアクセス権を持っているように見えることはできません。これを念頭に置いて、私はFetchEMailsクラスにRunnableを実装し、すべてのフェッチコードをrun()でやってしまいました。 run()の最後のコードは変数を 'true'に設定しています。私のアクティビティクラスでは、私はクラスをインスタンス化して、私はこれをやった:new Thread(e).start();。以下は、クラスがrun()メソッドの最後まで終了したことを確認するためのwhileループです(変数がtrueであるかどうかをチェックすることによって)。だから私はUIにintefereしない私の新しいtheardardを作成し、コードが完了したら、私はメッセージを取得したい。しかし、私はまだNetworkOnMainThreadExceptionエラーが出るようです。それに関する助けが感謝されます。ありがとう。

答えて

1

代わりにAsyncTaskを使用してください。

+0

これまでAsyncTaskを見てきましたので、基本的にはAsyncTaskからクラスを拡張し、doBackgroundのすべてのコマンドを実行する必要があります。しかし、その後、私は電子メールを取得し、私はArrayListにそれらを格納することを終了したらどのように私は、フェッチを終了し、今私はArrayListにアクセスすることができます私のアクティビティクラスで知っている? –

+0

onPostExecute()の "UI"スレッドを更新することができます。そのため、AsyncTaskクラスにコールバックを渡すことも、アクティビティの内部クラスとして宣言することもできます。次に、そこにアダプタまたはターゲットarraylistを更新することができます。 – dmon

+0

応答ありがとう、私はAsyncTaskでそれを行うことができた –

関連する問題