-1

我想从网上下载详细信息并在 中更新 UI doInBackground(),为此我认为我必须在该方法中获取对活动的引用。我该怎么做或者有其他方法可以做到这一点?什么必须是参数?或者不能实时更新UI?

public class DownloadActivity extends ListActivity {

public class DownloadItems extends AsyncTask<Something,Integer,Long> {

    @Override
    protected Long doInBackground(DownloadActivity... params) {

        Toast.makeText(params[0], getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show();
        return null;
    }

}

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    new DownloadItems().execute(Something);
}

}
4

5 回答 5

2

您可以使用处理程序或在 onPostExecute() 中更新您的 UI,我建议这样做。让您的 Async 处理其后台逻辑并在工作完成后更新 UI。

于 2013-08-27T16:41:47.520 回答
0

您不能在 中执行 UI 操作doInBackground(),您必须在 中执行它们onPostExecute()。在 DownloadActivity 中,您将创建一个 DownloadItems 实例,并将您要下载内容的 url 传递给它:例如:

public class DownloadActivity extends ListActivity {

    private void someMethod() {
        DownloadItems yourTask = new DownloadItems(getApplicationContext());
        yourTask.execute(yourUrl);
    }

在 AsyncTask 中,您将执行下载操作doInBackground()并返回结果,以便可以通过以下方式处理onPostExecute()

public class DownloadItems extends AsyncTask<Something,Integer,Long> {

    Context mContext;

    public DownloadItems(Context context){
        mContext = context;
    }

    @Override
    protected String doInBackground(String... params) {

        String theResult;
        // download operations using url stored in params[0], and where you set theResult variable (for example...)
        return theResult;
    }

onPostExecute()中,您处理结果,例如在上面的代码中,您可以调用 Toast :

      @Override
      protected void onPostExecute(String result) {
          Toast.makeText("YOUR TAG", result, Toast.LENGTH_SHORT).show();
      }
于 2013-08-27T17:00:44.450 回答
0

您可以创建一个构造函数来传递或添加 Context 作为参数。

public class DownloadItems extends AsyncTask<Something,Integer,Long> {

    Context context;

    public DownloadItems(Context cntx){
        context = cntx;
    }
    @Override
    protected Long doInBackground(DownloadActivity... params) {

        //Toast.makeText(params[0], getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show();
        Toast.makeText(context, "String test", Toast.LENGTH_SHORT).show();
        return null;
    }

}

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    new DownloadItems(this).execute(Something);
}

通过传递活动的上下文,您可以进行任何与上下文相关的操作。

于 2013-08-27T16:40:18.063 回答
0

最好的方法是简单地将影响 UI 的任何内容移入,onPostExecute()因为它可以让您更新 UI,这就是重点。

还有其他方法,但是当使用 AsyncTask 时,真的没有理由不使用它。

public class DownloadActivity extends ListActivity {

    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        new DownloadItems(this).execute();
    }

    public class DownloadItems extends AsyncTask<Something,Integer,Long> {

        private Context context;

        public DownloadItems(Context c){
            context = c;
        }

        @Override
        protected Long doInBackground(DownloadActivity... params) {
            // Do something
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Toast.makeText(context, context.getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show();
        }
    }
}
于 2013-08-27T17:04:36.633 回答
0

你可以在 doInBackground 中调用它:

runOnUiThread(new Runnable() {
   public void run() {
       //Your code
   }
});

但是不对...请阅读AsyncTask了解更多详细信息,或使用 onPostExecute 更新 UI...

于 2013-08-27T17:04:56.027 回答