【问题标题】:Android AsyncTask problemAndroid AsyncTask 问题
【发布时间】:2010-08-20 08:11:06
【问题描述】:

我有一个要使用 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 方法没有被调用,是这个问题吗??

谢谢

【问题讨论】:

  • 如何运行任务?你能发布更多代码吗?现在代码似乎是正确的。
  • 这一行不应该编译:CustomTask().execute(); -- 应该是 new CustomTask().execute();

标签: android android-asynctask


【解决方案1】:

答案很简单,

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

您忘记了超类的 @Override 执行调用 onPostExecute,因为它尚未被覆盖。

【讨论】:

    【解决方案2】:
    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();
            }
        }
    }
    

    【讨论】:

    • 这只是我提交的语法错误,然后我在这里重写代码,它运行良好,但字符串的值仍然是“oldString”它没有改变
    • 更改了代码,它现在确实正确地更改了“str”变量。
    【解决方案3】:

    您为什么决定它不运行?以下代码可以正常工作(修复了您的语法错误):

    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");
    
            }
    
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      拥有我们自己的 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();
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多