2010-08-20 1 views
2

У меня есть строка, что я хочу, чтобы обновить с помощью AsyncTask класса вот мой код:Android AsyncTask проблема

public class MainActivity extends Activity{ 

private String str = "oldString"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     getString(); 
     } 
     private void getString(){ 
       new CustomTask().execute(); 
     } 

    private class CustomTask extends AsyncTask<Void, Void, String>{ 

      @Override 
      protected String doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      Log.i("Lesson3", "doInBackground method"); 
      str = "newString"; 
      return "someString"; 
      } 

      protected void onPostExecute(String s){ 
      Log.i("Lesson3", "onPostExecute method"); 

      } 

} 

метод onPostExecute не называется, вот проблема ??

Благодаря

+0

Как выполнить задачу? вы могли бы разместить больше кода? Прямо сейчас код кажется правильным. –

+0

Эта строка не должна компилироваться: CustomTask(). Execute(); - должен быть новый CustomTask(). execute(); –

ответ

0
public class MainActivity extends Activity { 

    private String str = "oldString"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     getString(); 
    } 

    private void getString() { 
     new CustomTask().execute(); 
    } 

    private void postExecuteCallback() { 
     Log.i("Lesson3", "String after callback: " + str); 
    } 

    private class CustomTask extends AsyncTask<Void, Void, String> { 

     @Override 
     protected String doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      Log.i("Lesson3", "doInBackground method"); 
      str = "newString"; 
      return "someString"; 
     } 

     protected void onPostExecute(String s) { 
      Log.i("Lesson3", "onPostExecute method"); 
      postExecuteCallback(); 
     } 
    } 
} 
+0

это просто синтаксическая ошибка waht, которую я совершил, тогда я переписываю код здесь, он запускает прекрасную булочку, значение строки остается «oldString», это не изменилось. – Maki

+0

Изменен код, он корректно изменит переменную «str» правильно. – Bakapii

0

Почему вы решили, что это не работает? Следующий код работает просто отлично (фиксированные синтаксические ошибки в вашей):

package com.stackoverflow; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 

public class Test extends Activity { 

    private String str = "oldString"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     getString(); 
    } 

    private void getString() { 
     new CustomTask().execute(); 
    } 

    private class CustomTask extends AsyncTask<Void, Void, String> { 

     @Override 
     protected String doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      Log.i("Lesson3", "doInBackground method"); 
      str = "newString"; 
      return "someString"; 
     } 

     protected void onPostExecute(String s) { 
      Log.i("Lesson3", "onPostExecute method"); 

     } 

    } 

} 
2

Ответ прост,

@Override 
protected void onPostExecute(String s){ 
     Log.i("Lesson3", "onPostExecute method"); 
} 

Вы забыли своё @Override Выполнить звонки onPostExecute из суперкласса, так как он не был переопределен в все же.

0

Как насчет наличия собственной AsyncTask?

Пожалуйста, смотрите.

public abstract class CustomAsyncTask<Params, Progress, Result> { 

    private boolean isFinished = false; 
    private Result res; 

    protected void onPreExecute() { 

    } 

    protected void onPostExecute(Result result) { 

    } 

    protected void onProgressUpdate(Progress progress) { 

    } 

    protected abstract Result doInBackground(Params...params); 

    private void CheckAndUpdateUI() 
    { 
     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       if(isFinished) 
       { 
        onPostExecute(res); 
       } 
       else 
        CheckAndUpdateUI(); 
      } 
     },500); 
    } 

    public void execute(final Params...params) 
    { 
     onPreExecute(); 
     // 
     CheckAndUpdateUI(); 
     isFinished = false; 
     // 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       res = doInBackground(params); 
       isFinished = true; 
      } 
     }).start(); 
    } 

}