2011-12-19 26 views
1

我有doInBackground()。功能後,我想更改一些TextViewMainActivity。 但是當我在主要活動上觸發功能時,我在TextView行上得到NullPointerExceptiononPostExecute()不能使用MainActivity元素

protected String doInBackground(Object... arguments) { 

    some code.. 

    return result; 
} 

@Override 
protected void onPostExecute(String result) { 
    if(result!=null) 
     new MainActivity().setScoreListUpdate(result); 
} 

MainActivity:

public void setScoreListUpdate(String settings) 
{ 
    String[] yeniscore = settings.split("\\|"); 

    if(yeniscore.length > 1) 
    { 
      birinci.setText(yeniscore[1]); << NULLPOINTEREXC. 
    } 
} 
+0

在MainActivity的onCreate方法中,是否通過調用find來獲取TextView birinci ViewById? – 2011-12-19 14:27:53

+0

@Chunhui yes .. birinci =(TextView)findViewById(R.id.birinci); – Mert 2011-12-19 14:29:37

回答

2

的原因,這給出了一個NullPointerException是你創造的,而不是在現有的一個工作的MainActivity一個新的實例。

您需要做的是將對Activity的引用傳遞給AsyncTask,然後在該引用上調用您的方法。

AsyncTask

所以-​​class你將有一個變量:

private MainActivity myMainActivity; 

添加一個構造函數,以您的AsyncTask -class:

public MyAsyncTaskClassName(MainActivity activity) { 
    myMainActivity = activity; 
} 

然後在onPostExecute你做:

myMainActivity.setScoreListUpdate(result); 
+0

只是嘗試完美的作品..非常感謝你:) – Mert 2011-12-19 14:43:06

1

使用

MainActivity.this.setScoreListUpdate(result); 

代替

new MainActivity().setScoreListUpdate(result); 

在YOUT postExecute方法。

此外,稱爲birinci的TextView應該是MainActivity類中的字段,而不僅僅是onCreate方法中的變量。

編輯:它在我的程序中是這樣工作的。檢查差異。

public class DeviceSettingsStatsActivity extends ListActivity { 

    AsyncTask<Void, Integer, ListAdapter> task = null; 
    ListAdapter listAdapter = null; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     task = new ComputeTask().execute(); 
    } 

    protected void viewComputeResult(ListAdapter result) { 
     setListAdapter(result); 
    } 

    private class ComputeTask extends AsyncTask<Void, Integer, ListAdapter> { 

     @Override 
     protected ListAdapter doInBackground(Void... params) { 
      // some stuff 
     } 

     @Override 
     protected void onPostExecute(ListAdapter result) { 
      DeviceSettingsStatsActivity.this.viewComputeResult(result); 
     } 
    } 
} 
+0

我試過,但得到了「沒有封閉的MainActivity類型的實例可以在範圍內訪問」 – Mert 2011-12-19 14:24:45

+0

嘗試從我的編輯中得到的東西。 – Moyshe 2011-12-19 14:35:35

+0

這個作品因爲它們在相同的範圍內。但感謝您的時間。真的很高興你們:) – Mert 2011-12-19 14:44:35