【问题标题】:android getIntent doInBackgroundandroid getIntent doInBackground
【发布时间】:2012-10-22 12:41:56
【问题描述】:

我是安卓新手。我试图从一个活动中得到这个:

i.putExtra("mlat", String.valueOf(latitude));

到这里:

public class PostDataActivity extends AsyncTask<Void, Void, Void>{
    GpsData gps;
//  double latitude = gps.getLatitude(); 
    //String mlat;

    @Override
    protected Void doInBackground(Void... params) {
        Bundle extras = getIntent().getExtras();
        String mlat = extras.getString("mlat");

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://test.de");
         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
          nameValuePairs.add(new BasicNameValuePair("lat", mlat));
          nameValuePairs.add(new BasicNameValuePair("lon", "7.358154"));
           try {
            httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
           }
           try {
            httpClient.execute(httpPost);
           } catch (ClientProtocolException e) {
            e.printStackTrace();
           } catch (IOException e) {
            e.printStackTrace();
           }
        return null;
    }

但是 getIntent 是未定义的

Bundle extras = getIntent().getExtras();
String mlat = extras.getString("mlat");

如何在Activity和doInBackground之间传输数据?

【问题讨论】:

  • 从您之前的问题来看,您还没有学会阅读文档/自己一点点思考。让您步入正轨:getIntent() 定义在哪个类中?
  • Step2 : 如何将参数传递给类? (提示:它与构造函数和成员变量有关)。

标签: android android-intent android-asynctask


【解决方案1】:

AsyncTaskexecute 方法接受一个字符串参数数组,可用于将额外数据获取到后台任务中。

这是来自Android source documentation的示例:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

  ..
}

你可以这样从主线程调用它:

new DownloadFilesTask().execute(url1, url2, url3);

【讨论】:

    【解决方案2】:

    Intent 不包含任何内容,因为您正在扩展 AsyncTask。 我认为整个方法是有缺陷的。

    由于PostDataActivity 是一个Activity,它不应该扩展AsyncTask。 以下是我认为应该是什么样子的想法:

    public class PostDataActivity extends Activity {
    GPSData gps;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.);
    
        Bundle extras = getIntent().getExtras();
        String mlat = extras.getString("mlat");
    
        MyDownloaderTask task = new MyDownloaderTask();
        task.execute(mlat);
    }
        //Check docs for parameterisation of AsyncTask
    private class MyDownloaderTask extends AsyncTask<String, Void, String> {
        protected String doInBackground(String params...) {
            string someResult;
            String mlat = params[0];
            //Got your variable, do whatever you want from here on
            return someResult; //Since it is no longer AsyncTask<Void, Void, Void>
        }
        protected void onPostExecute(String result) {
            //This executes after task completes successfully
        }
        protected void onCancelled(String result) {
            //This executes after task completes unsuccessfully
        }
    }
    
    //...
    }
    

    【讨论】:

      【解决方案3】:

      首先通过我的马特提供的教程。

      对于你的情况,你必须修改你的代码如下:

      1.将参数类型从 void 更改为 String:

      公共类 PostDataActivity 扩展 AsyncTaskString, Void, Void>{

      2.将您的数据作为参数传递给 AsyncTask:

      new PostDataActivity().execute("mlat");

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-05
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        相关资源
        最近更新 更多