获取 IndexOutOfBoundException:无效的数组范围 0 到 0,因此上下文 = null,因此应用程序崩溃
getting IndexOutOfBoundException : Invalid array range 0 to 0 , So context = null, So App crashes
进行 InterstitialAd 练习,onClick 按钮,调用 tellJoke()。 tellJoke() 调用 AsyncTask 。
在 AsyncTask 中,params size 是 0 ,得到 IndexOutOfBundException,所以 context 是 null。
MainActivity.java
public class MainActivity 扩展 AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "after setting activity main");
}
public static void tellJoke(View view){
new EndpointsAsyncTask().execute();
}
}
MainActivityFragment.java
public class MainActivityFragment extends Fragment {
InterstitialAd mInterstitialAd;
public MainActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_main, container, false);
AdView mAdView = (AdView) root.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
mAdView.loadAd(adRequest);
//interstitialAd part starts here
mInterstitialAd = new InterstitialAd(getActivity());
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
MainActivity.tellJoke(getView());
}
});
return root;
}
private void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
mInterstitialAd.loadAd(adRequest);
}
}
EndpointsAsyncTask.java
public class EndpointsAsyncTask extends AsyncTask<Context, Void, String> {
private static String LOG_TAG = EndpointsAsyncTask.class.getSimpleName();
private static MyApi myApiService = null;
private Context context ;
@Override
protected String doInBackground(Context... params) {
if(myApiService == null) { // Only do this once
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("https://build-it-bigger.appspot.com/_ah/api/");
// end options for devappserver
myApiService = builder.build();
}
if (params != null) {
context = params[0];
}
try {
return myApiService.fetchJoke().execute().getData();
} catch (IOException e) {
return e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
if (context != null) {
Intent intent = new Intent(context, JokeDisplayActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, result);
context.startActivity(intent);
}
}}
请帮忙,我哪里做错了?如果有其他方法,请提出建议。
调用时只需为 AsyncTask 提供参数 execute
(也删除静态):
public void tellJoke(View view){
new EndpointsAsyncTask().execute(getActivity());
}
this
引用 activity 并因此实现 Context
接口(如果从 activity 调用)。
编辑:
将您的 tellJoke
方法移动到 Fragment 并像这样调用它:
tellJoke();
请注意,现在您没有通过 this
,而是通过了 getActivity()
,因为您在片段中。
进行 InterstitialAd 练习,onClick 按钮,调用 tellJoke()。 tellJoke() 调用 AsyncTask 。 在 AsyncTask 中,params size 是 0 ,得到 IndexOutOfBundException,所以 context 是 null。
MainActivity.java
public class MainActivity 扩展 AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "after setting activity main");
}
public static void tellJoke(View view){
new EndpointsAsyncTask().execute();
}
}
MainActivityFragment.java
public class MainActivityFragment extends Fragment {
InterstitialAd mInterstitialAd;
public MainActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_main, container, false);
AdView mAdView = (AdView) root.findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
mAdView.loadAd(adRequest);
//interstitialAd part starts here
mInterstitialAd = new InterstitialAd(getActivity());
mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
MainActivity.tellJoke(getView());
}
});
return root;
}
private void requestNewInterstitial() {
AdRequest adRequest = new AdRequest.Builder()
.addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
.build();
mInterstitialAd.loadAd(adRequest);
}
}
EndpointsAsyncTask.java
public class EndpointsAsyncTask extends AsyncTask<Context, Void, String> {
private static String LOG_TAG = EndpointsAsyncTask.class.getSimpleName();
private static MyApi myApiService = null;
private Context context ;
@Override
protected String doInBackground(Context... params) {
if(myApiService == null) { // Only do this once
MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(), null)
.setRootUrl("https://build-it-bigger.appspot.com/_ah/api/");
// end options for devappserver
myApiService = builder.build();
}
if (params != null) {
context = params[0];
}
try {
return myApiService.fetchJoke().execute().getData();
} catch (IOException e) {
return e.getMessage();
}
}
@Override
protected void onPostExecute(String result) {
if (context != null) {
Intent intent = new Intent(context, JokeDisplayActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, result);
context.startActivity(intent);
}
}}
请帮忙,我哪里做错了?如果有其他方法,请提出建议。
调用时只需为 AsyncTask 提供参数 execute
(也删除静态):
public void tellJoke(View view){
new EndpointsAsyncTask().execute(getActivity());
}
this
引用 activity 并因此实现 Context
接口(如果从 activity 调用)。
编辑:
将您的 tellJoke
方法移动到 Fragment 并像这样调用它:
tellJoke();
请注意,现在您没有通过 this
,而是通过了 getActivity()
,因为您在片段中。