2013-06-17 2 views
2

Я новичок в Шаге отдыха, когда я вызываю @ Background из MainActivity для извлечения данных с сервера покоя, это нормально. Но после того, как я назвал это из Фрагмента, это не будет.Получить NullPointerException после метода интерфейса вызова Fragment

Вот мой Main:

package com.example.androidkickstart; 

import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.util.Log; 
import android.widget.ListView; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.ActionBar.Tab; 
import com.actionbarsherlock.app.ActionBar.TabListener; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 
import com.actionbarsherlock.view.Menu; 
import com.example.androidkickstart.adapter.ViewPagerAdapter; 
import com.example.androidkickstart.object.MoviesList; 
import com.example.androidkickstart.rest.RestClient; 
import com.example.androidkickstart.rest.getMovieListAsync; 
import com.googlecode.androidannotations.annotations.AfterViews; 
import com.googlecode.androidannotations.annotations.Background; 
import com.googlecode.androidannotations.annotations.EActivity; 
import com.googlecode.androidannotations.annotations.UiThread; 
import com.googlecode.androidannotations.annotations.ViewById; 
import com.googlecode.androidannotations.annotations.rest.RestService; 

@EActivity(R.layout.activity_main) 
public class MainActivity 
extends SherlockFragmentActivity 
implements OnPageChangeListener, TabListener 
{ 

/******* Declare Class *******/ 
@RestService 
RestClient restClient;   

/******* Variable Declaration *******/ 
private String[] locations; 
MoviesList movieList; 

/******* View Declaration *******/ 
@ViewById      
ViewPager pager;     
ListView List; 


/********** Things to do after View Declaration *********/ 
@AfterViews 
void afterViews() { 
    locations = getResources().getStringArray(R.array.locations); 
    configureViewPager(); 
    configureActionBar(); 
    doSomethingInBackground(); 
} 


/******* samilar to OnPostExecute, OnPreExecute *******/ 
@UiThread 
void doSomethingElseOnUiThread() { 
    // do something on UIThread 
} 

@Background 
void doSomethingInBackground() { 
    movieList=restClient.main(); 
    doSomethingElseOnUiThread(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getSupportMenuInflater(); 
    return true; 
} 

private void configureViewPager() { 
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), locations); 
    pager.setAdapter(viewPagerAdapter); 
    pager.setOnPageChangeListener(this); 
} 

public void onPageSelected(int position) { 
    Tab tab = getSupportActionBar().getTabAt(position); 
    getSupportActionBar().selectTab(tab); 
} 

private void configureActionBar() { 
    getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
    for (String location: locations) { 
     Tab tab = getSupportActionBar().newTab(); 
     tab.setText(location); 
     tab.setTabListener(this); 
     getSupportActionBar().addTab(tab); 
    } 
} 

@Override 
public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    int position = tab.getPosition(); 
    pager.setCurrentItem(position); 
} 
@Override 
public void onPageScrollStateChanged(int position) {}@Override 
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)  {}@Override 
public void onTabUnselected(Tab tab, FragmentTransaction ft) {}@Override 
public void onTabReselected(Tab tab, FragmentTransaction ft) {} 
} 

Вот мой RestClient:

package com.example.androidkickstart.rest; 

import com.example.androidkickstart.object.MoviesList; 
import com.googlecode.androidannotations.annotations.rest.Get; 
import com.googlecode.androidannotations.annotations.rest.Rest; 
import org.springframework.http.converter.StringHttpMessageConverter; 
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;; 

@Rest(rootUrl = "http://mubi-app.herokuapp.com", converters = MappingJacksonHttpMessageConverter.class) 
public interface RestClient { 


@Get("/api/v1/home") 
public MoviesList main(); 

} 

Но когда я называю мой RestClient из MovieListFragment (Фрагмент), я получил странные проблемы. Вот мой MovieListFragment ...

package com.example.androidkickstart; 

import java.util.ArrayList; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.SimpleAdapter; 
import android.widget.TextView; 

import com.example.androidkickstart.adapter.BaseAdapter; 
import com.example.androidkickstart.object.MoviesList; 
import com.example.androidkickstart.object.movies; 
import com.example.androidkickstart.rest.RestClient; 
import com.googlecode.androidannotations.annotations.AfterViews; 
import com.googlecode.androidannotations.annotations.Background; 
import com.googlecode.androidannotations.annotations.EFragment; 
import com.googlecode.androidannotations.annotations.UiThread; 

import com.googlecode.androidannotations.annotations.ViewById; 
import com.googlecode.androidannotations.annotations.rest.RestService; 

@EFragment(R.layout.layout_main) 
public class MovieListFragment 
extends Fragment 
{ 

View v; 
MoviesList moviesList; 
BaseAdapter adapter; 
Context context; 

@RestService 
RestClient restClientFragment; 

@ViewById 
TextView txtMovieList; 
ListView list; 

@AfterViews 
void afterViews() {  

    txtMovieList.setText("Movie LIst"); 
    doSomethingInBackground(); 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 
    v=inflater.inflate(R.layout.layout_main, null); 
    return v; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    context=view.getContext(); 
    txtMovieList=(TextView)v.findViewById(R.id.txtMovieList); 
    list=(ListView)v.findViewById(R.id.list); 
    afterViews(); 

} 
/******* samilar to OnPostExecute, OnPreExecute *******/ 
@UiThread 
void doSomethingElseOnUiThread() { 
    // do something on UIThread 
} 

@Background 
void doSomethingInBackground() { 
    String str=restClientFragment.main().toString(); 
    doSomethingElseOnUiThread(); 
} 
} 

А вот моя ошибка ...

06-17 11:17:07.919: E/AndroidRuntime(791): FATAL EXCEPTION: main 
06-17 11:17:07.919: E/AndroidRuntime(791): java.lang.NullPointerException 
06-17 11:17:07.919: E/AndroidRuntime(791): at com.example.androidkickstart.MovieListFragment.doSomethingInBackground(MovieListFragment.java:88) 
06-17 11:17:07.919: E/AndroidRuntime(791): at com.example.androidkickstart.MovieListFragment.afterViews(MovieListFragment.java:62) 
06-17 11:17:07.919: E/AndroidRuntime(791): at com.example.androidkickstart.MovieListFragment.onViewCreated(MovieListFragment.java:76) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.view.ViewPager.populate(ViewPager.java:1012) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.view.ViewPager.populate(ViewPager.java:881) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1366) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.View.measure(View.java:8313) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.View.measure(View.java:8313) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.View.measure(View.java:8313) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.LinearLayout.measureVertical(LinearLayout.java:531) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.View.measure(View.java:8313) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.View.measure(View.java:8313) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.View.measure(View.java:8313) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.ViewRoot.performTraversals(ViewRoot.java:843) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.view.ViewRoot.handleMessage(ViewRoot.java:1863) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.os.Looper.loop(Looper.java:130) 
06-17 11:17:07.919: E/AndroidRuntime(791): at android.app.ActivityThread.main(ActivityThread.java:3768) 
06-17 11:17:07.919: E/AndroidRuntime(791): at java.lang.reflect.Method.invokeNative(Native Method) 
06-17 11:17:07.919: E/AndroidRuntime(791): at java.lang.reflect.Method.invoke(Method.java:507) 
06-17 11:17:07.919: E/AndroidRuntime(791): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
06-17 11:17:07.919: E/AndroidRuntime(791): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
06-17 11:17:07.919: E/AndroidRuntime(791): at dalvik.system.NativeStart.main(Native Method) 

Я потратил несколько часов, чтобы решить эту проблему, но я новый пользователь отдыха шаблона , и я также не очень хорошо знаю, как работает шаблон отдыха. Я надеюсь, что кто-то избавит меня от этой проблемы.

Спасибо,

ответ

0
RestClient restClientFragment; 

String str=restClientFragment.main().toString(); 

Вы должны инициализировать restClientFragment где-то! Это означает, что это ошибка вашего NE.

+0

Хорошо, почему это нормально в MainActivity, я не получаю сообщение об ошибке. И я попробовал, так как предлагаю, @RestService RestClient restClientFragment = new RestClient(); Я получил эту ошибку «Невозможно создать экземпляр типа RestClient» – SAWAUNG

+0

RestClient - это интерфейс. В MainActivity вы вызываете только main. Но в MovieListFragment вы вызываете main(). ToString(). –

+0

Спасибо, я так изменился, но у меня все еще есть nullPointerException. moviesList = restClientFragment.main(); – SAWAUNG

0

У меня есть способ решить эту проблему NullPointerException для вызова формы метода метода вызова, я не уверен, что проблема может быть связана с фоновым потоком фрагмента. И фрагмент является суб-активностью основной активности, так как я имею в виду выше, я успешно могу вызвать метод интерфейса из основной активности. i объявлять интерфейс RestClient как «RestClient restClient»; в фрагменте (subActivity), но когда я обращаюсь к «restClient.main()», я получил исключение nullpointer. Я не совсем понимаю эту проблему, вот мой код, я решаю эту проблему.

прилагаю класс с именем RestClientHelper.java

public class RestClientHelper{ 
static RestClient restClient; 

public void setCallRestClient(RestClient rs){ 
    restClient=rs; 

} 
public MoviesList CallRestClient(){ 
    return restClient.main(); 
} 

}

"статический RestClient restClient;" в этой строке я использую static для удержания указателя RestClient(). И передаю RestClient из MainActivity.java в RestClientHelper.java и назначим restClient. Я добавляю эти строки кода в MainActivity.java.

@AfterViews 
void afterViews() { 
    locations = getResources().getStringArray(R.array.locations); 
    configureViewPager(); 
    configureActionBar(); 
    doSomethingInBackground(); 
    restHelper=new RestClientHelper(); 
    restHelper.setCallRestClient(restClient); 
} 

И я изменяю свой код MovieListFragment.java, как показано ниже;

@Background 
void doSomethingInBackground() { 
    String str=restClientFragment.main().toString(); 
    doSomethingElseOnUiThread(); 
    RestClientHelper rsHelper=new RestClientHelper(); 
    moviesList=rsHelper.CallRestClient(); 

}

Смежные вопросы