2017-03-12 17 views
0

これはおそらく重複とマークされることがわかっていますが、これは私を非常にイライラさせています。私の人生の間、AsyncTaskからテキストビューを変更する方法を理解できません。このコードを実行した後、AsyncTaskからUIを更新できない

@Override 
protected void onPostExecute(String result) { 
    MainActivity ma = new MainActivity(); 
    ma.updateTextView(result); 
} 

しかし

public void updateTextView(String data){ 
    TextView textview = (TextView)findViewById(R.id.TextView1); 
    textview.setText(data); 
} 

、その後、私のAsyncTaskに私が持っているからのTextViewを変更しようとすることを伴う任意の修正:これは私のMainActivityクラスである機能ですAsyncTaskは、私が取得:

のjava.lang.NullPointerException:nullのオブジェクト参照の上 ')android.view.Window $コールバックandroid.view.Window.getCallback(' 仮想メソッドを呼び出そうと

しかし、メインスレッドから同じ正確な関数を呼び出すと、正常に動作します。

ご協力いただければ幸いです。

+3

'MainActivity ma = new MainActivity()' ???新しいアクティビティを作成しようとしていますか? – azizbekian

+0

AsyncTaskが別のクラスなので、[OnPostExecute()の結果をメインアクティビティに取得する方法]の可能な複製?](http://stackoverflow.com/questions/12575068/how-to-get-the-result-of- onpostexecute-to-main-activity-asynctask-is-a) –

+0

MainActivityの新しいインスタンスを作成しないでください!代わりに、AsyncTaskを作成するときにインスタンスをパラメータとして渡し、メソッドを呼び出すために使用します。 –

答えて

1

アクティビティから新しいオブジェクトを作成し、それを操作します。また、あなたがあなたの活動に

をごAsyncTaskオブジェクトを作成するには、この方法でこの

@Override 
protected void onPostExecute(String result) { 
    activity.updateTextView(result); 
    } 

コールを編集し、あなたのAsyncTaskクラスに

MainActivity activity; 

public void setContext(MainActivity activity){ 
    this.activity = activity; 
    } 

をこのコードを追加アクティビティ

への参照を取得しよう

//at is the object you created from your AsyncTask Class 
at.setContext(this); 
+0

素晴らしい作品です!ありがとう! – Jake

+0

あなたはrunOnUiThreadのようなものを使う必要はありません。 AsyncTaskのOnPostExecuteはUIスレッドで既に呼び出されています。 – pablo432

+0

あなたは正しいですpablo432 –

関連する問題