2017-01-26 20 views
0

Прежде чем продолжить, я бы сказал, что у меня есть время разработки на Android менее 10 часов, поэтому, пожалуйста, будьте осторожны с вашим ответом.Деятельность - BackgroundTask throwing runtime

Я думал, что у меня был прорыв, когда вы пытались вернуть значение из фоновой задачи в действие вкладки. Прочитайте несколько потоков, в которых говорится, что ответ лежит на интерфейсе/слушателе, поэтому я подумал, что сделал это правильно (см. Ниже), и он запускает среду выполнения.

Я попытаюсь добавить комментарии в коде, так что вы можете следить за

The Tab активность

public class Tab1Activity extends Activity implements ValueListener 
    { 

     String task,username,password; 

     @Override 
     public void onValueComputed(String computedValue) 
     { 
      //do something... 
     } 

@Override 
protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tab1); 

      BackgroundTask backgroundTaskLogin = new BackgroundTask(Tab1Activity.this);  
      backgroundTaskLogin.execute(task,username,password); 
     } 
} 

Это фоновая задача

public class BackgroundTask extends AsyncTask<String,Void,String> 
{ 
     Context context; 




     BackgroundTask(Context ctx) 
     { 
      this.context = ctx; 
     } 

     @Override 
     protected String doInBackground(String... params) 
     { 
      // do stuff 
      return datastuff  
     } 

///////////////////////////////// 

@Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 


     } 
/////////////////////////////////////// 


     @Override 
     protected void onProgressUpdate(Void... values) 
     { 
      super.onProgressUpdate(values); 
     } 


////////////////////////////// 


     ValueListener listener; 

     public void MyAsyncTask (ValueListener valueListener) 
     { 
      this.listener = valueListener; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 


      listener.onValueComputed(result); 

// The value gets here OK - but when adding the above listener it throws a runtime 

      System.out.println("kkkkkkkkkkkkkkkkkk"+result); 

     } 

Это интерфейс

public interface ValueListener 
{ 
     public void onValueComputed(String computedValue); 

} 

Это ошибка

01-26 17:26:20.935: E/AndroidRuntime(869): FATAL EXCEPTION: main 
01-26 17:26:20.935: E/AndroidRuntime(869): Process: com.example.tabdemo, PID: 869 
01-26 17:26:20.935: E/AndroidRuntime(869): java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.tabdemo.ValueListener.onValueComputed(java.lang.String)' on a null object reference 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.example.tabdemo.BackgroundTask.onPostExecute(BackgroundTask.java:223) 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.example.tabdemo.BackgroundTask.onPostExecute(BackgroundTask.java:1) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.AsyncTask.finish(AsyncTask.java:651) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.AsyncTask.access$500(AsyncTask.java:180) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.Handler.dispatchMessage(Handler.java:102) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.Looper.loop(Looper.java:158) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.app.ActivityThread.main(ActivityThread.java:7224) 
01-26 17:26:20.935: E/AndroidRuntime(869): at java.lang.reflect.Method.invoke(Native Method) 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Все хорошо, пока я пытаюсь добавить слушателя, это очевидно, что проблема

+0

Move 'BackgroundTask backgroundTaskLogin = новый BackgroundTask (Tab1Activity.this); backgroundTaskLogin.execute (задача, имя пользователя, пароль); 'внутри метода. Ваш 'context' имеет значение null, когда он запускается до тех пор, пока не будет запущен жизненный цикл. – codeMagic

+0

Подождите, где вызвана' MyAsyncTask() '? – codeMagic

+0

Фоновые задачи были в рамках метода .. - обновлено –

ответ

0

Вы не инициализировали объект ValueListener. Я думаю, вы перепутались с логикой конструктора. Это ваш конструктор:

BackgroundTask(Context ctx) { 
    this.context = ctx; 
} 

Существует еще один способ, который вы можете ввести в заблуждение как ваш конструктор, но это не так.

public void MyAsyncTask (ValueListener valueListener) { 
      this.listener = valueListener; 
     } 

Теперь, так как вы никогда не называли MyAsyncTask(ValueListener valueListener), ваш listener ссылка на объект является недействительным и, следовательно, в java.lang.NullPointerException.

Это то, что вы должны сделать:

public class BackgroundTask extends AsyncTask<String,Void,String> 
{   
    private ValueListener listener; 

    BackgroundTask(ValueListener listener) 
    { 
     this.listener= listener; 
    } 
} 
0
@Override 
     protected void onPostExecute(String result) 
     { 


      listener.onValueComputed(result); 

// The value gets here OK - but when adding the above listener it throws a runtime 

      System.out.println("kkkkkkkkkkkkkkkkkk"+result); 

     } 

Вы не определили слушатель так это вызывает NPE на

listener.onValueComputed(result); 

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

  • Нет связанных вопросов^_^