Android 获取IndexOutOfBoundException:数组范围0到0无效,因此上下文=null,因此应用程序崩溃
正在进行间隙练习,单击按钮,调用tellJoke()。tellJoke()调用异步任务。 在AsyncTask中,参数大小为0,获取IndexOutfBundException,因此上下文为空。 MainActivity.javaAndroid 获取IndexOutOfBoundException:数组范围0到0无效,因此上下文=null,因此应用程序崩溃,android,android-asynctask,interstitial,Android,Android Asynctask,Interstitial,正在进行间隙练习,单击按钮,调用tellJoke()。tellJoke()调用异步任务。 在AsyncTask中,参数大小为0,获取IndexOutfBundException,因此上下文为空。 MainActivity.java public class MainActivityFragment extends Fragment { InterstitialAd mInterstitialAd; public MainActivityFragment() { } @Over
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);
}
}
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);
}
}}
公共类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);
}
}
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);
}
}}
EndpointsAsyncTask.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);
}
}
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);
}
}}
公共类EndpointsAsyncTask扩展异步任务{
私有静态字符串LOG_TAG=EndpointsAsyncTask.class.getSimpleName();
私有静态MyApi myApiService=null;
私人语境;
@凌驾
受保护字符串doInBackground(上下文…参数){
如果(myApiService==null){//只执行一次
MyApi.Builder=new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
新的AndroidJsonFactory(),null)
.setRootUrl(“https://build-it-bigger.appspot.com/_ah/api/");
//devappserver的结束选项
myApiService=builder.build();
}
如果(参数!=null){
上下文=参数[0];
}
试试{
返回myApiService.fetchJoke().execute().getData();
}捕获(IOE异常){
返回e.getMessage();
}
}
@凌驾
受保护的void onPostExecute(字符串结果){
if(上下文!=null){
意向意向=新意向(上下文,JokeDisplayActivity.class);
intent.putExtra(intent.EXTRA_文本、结果);
背景。开始触觉(意图);
}
}}
请帮助,我哪里做错了?请建议是否有其他方法来执行此操作。在调用
execute
时,只需提供AsyncTask的参数即可(同时删除static):
此
引用活动,因此实现了上下文
接口(如果从活动调用)
编辑:
将tellJoke
方法移动到片段并如下调用它:
tellJoke();
请注意,现在您没有传递
这个,而是传递getActivity()
,因为您在一个片段中。params size是0,因为您没有传递任何参数…@njzk2谢谢。我需要在哪里传递参数?如果我喜欢,请指导-new EndpointsAsyncTask()。执行(此);从tellJoke()中删除静态关键字后),然后在MainActivityFragment中遇到问题,声明“非静态方法无法从静态上下文引用。请在此处进行指导。谢谢,但如果我传递此消息,则必须删除静态关键字。如果我删除此消息,则在MainActivityFragment中遇到问题,声明-“非静态无法从静态上下文引用”“.please help…”现在我再次遇到此错误并导致应用程序崩溃-“在android的父或祖先上下文中找不到方法(视图):视图类上定义的onClick属性”我只调用OnCutle XML中的TelPoice。在您的按钮上添加java代码中的“点击监听器”。它非常简单。它调用了 TelPooals<代码>。非常感谢。现在App工作得很好,但是MultILTALAD没有显示。请在这里指导我。没有问题。如果它修复了您原来的问题,请考虑接受答案。F或者广告没有显示,这是一个完全不同的事情,尝试谷歌一点或张贴一个新的问题,如果你无法解决它自己请…最好的问候,享受编码!