多个操作的后台任务 - Android

Posted

技术标签:

【中文标题】多个操作的后台任务 - Android【英文标题】:Background Task for multiple operations- Android 【发布时间】:2016-08-21 16:13:05 【问题描述】:

我正在使用 php 作为 Web 服务、android Studio 2.1.2 将多个字段插入 mysql DB,并在物理设备 (Android 4.4.2) 上进行测试。我有一个数据库交互的后台任务。在完成所有数据库条目之前,我不希望下一个活动出现。是否有一些代码可以在 onPostExucte() 或其他任何地方使用,只有在插入信息后才会打开 Activity。 我在 onPostExecute() 中使用以下代码:

    Intent intent = new Intent(ctx, Dashboard.class  );
    ctx.startActivity(intent);

但它会跳转到另一个 Activity,然后在几秒钟后打开下一个 Activity。

我遇到的第二个问题是将带有所有其他信息的图像携带到数据库中。我有一个从设备检索图像获得的 URI。现在根据我的研究,我知道这个 URI 必须变成位图,而位图又必须变成 Base64,对吗?我可以按原样发送URI吗?我正在尝试使用 DB 后台任务来格式化 URI,我尝试使用另一个后台任务,但我一定做错了什么。

我现在尝试插入不带图像的内容,但出现 ArrayIndexOutOfBoundsException 错误,它指向后台任务中的一行,其中我有一个要发送到数据库的参数。可以设置的参数数量有限制吗?

后台任务:

package name;
import statements;

public class BackgroundTask extends AsyncTask<String, Void, String> 
//Constructor needed to pass info into the BackgroundTask
Context ctx;
BackgroundTask(Context ctx)
    this.ctx = ctx;



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


@Override
protected String doInBackground(String... params) 
    //from this method pass info into MySQL DB
    String reg_url = "http://ipaddress/folder/phpscript.php";
    String method = params[0];
    if (method.equals("register"))
        String fname = params[1];
        String lname = params[2];
        String age = params[3];
        String mobnum = params[4];
        String homenum = params[5];
        String email = params[6];
        String city = params[7];
        String country = params[8];
        String gender = params[9];
        String dob = params[10];

        try 
            URL url = new URL(reg_url);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            OutputStream OS = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(OS,"UTF-8"));

            String data = URLEncoder.encode("user","UTF-8")+"="+URLEncoder.encode(fname,"UTF-8")+"&"+
                    URLEncoder.encode("lname","UTF-8")+"="+URLEncoder.encode(lname,"UTF-8")+"&"+
                    URLEncoder.encode("age","UTF-8")+"="+URLEncoder.encode(age,"UTF-8")+"&"+
                    URLEncoder.encode("mobnum","UTF-8")+"="+URLEncoder.encode(mobnum,"UTF-8")+"&"+
                    URLEncoder.encode("homenum","UTF-8")+"="+URLEncoder.encode(homenum,"UTF-8")+"&"+
                    URLEncoder.encode("email","UTF-8")+"="+URLEncoder.encode(email,"UTF-8")+"&"+
                    URLEncoder.encode("city","UTF-8")+"="+URLEncoder.encode(city,"UTF-8")+"&"+
                    URLEncoder.encode("country","UTF-8")+"="+URLEncoder.encode(country,"UTF-8")+"&"+
                    URLEncoder.encode("gender","UTF-8")+"="+URLEncoder.encode(gender,"UTF-8")+"&"+
                    URLEncoder.encode("dob","UTF-8")+"="+URLEncoder.encode(dob,"UTF-8");

            bufferedWriter.write(data);
            bufferedWriter.flush();
            bufferedWriter.close();
            OS.close();
            InputStream IS = httpURLConnection.getInputStream();
            IS.close();
            return "Registration success...";

         catch (MalformedURLException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        


    
    return null;


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


@Override
protected void onPostExecute(String result) 
    Intent intent = new Intent(ctx, Dashboard.class  );
    ctx.startActivity(intent);



Activity使用后台任务(按钮使用android:onClick调用方法):

public void userReg(View view)
//initialise variables by retreiving user input
    fname = ET_fname.getText().toString();
    lname = ET_lname.getText().toString();
    mobnum = ET_mobnum.getText().toString();
    homenum = ET_homenum.getText().toString();
    email =ET_email.getText().toString();
    city = ET_city.getText().toString();
    country = ET_country.getText().toString();
    gender = ET_gender.getText().toString();

    //pass info into the BackgroundTask
    String method ="register";
    BackgroundTask backgroundTask = new BackgroundTask(this);
    backgroundTask.execute(method, fname, lname, String.valueOf(age), mobnum, homenum, email, city, country, gender, dob);
    finish();

基本上我希望能够将信息和图像插入数据库。

PHP 网络服务:

<?php

require "init.php";

$fname=$_POST["user"];
$lname=$_POST["lname"];
$age=$_POST["age"];
$mobnum=$_POST["mobnum"];
$hnum=$_POST["homenum"];
$email=$_POST["email"];
$city=$_POST["city"];
$country=$_POST["country"];
$gender=$_POST["gender"];
$dob=$_POST["dob"];

$sql_query="insert into teacher_information values('$fname','$lname','$age','$mobnum','$hnum','$email','$city','$country','$gender', '$dob');";

?>

【问题讨论】:

【参考方案1】:

首先,可以在onPostExecute()方法中调用activity。 通过构造函数发送先前的上下文。 然后在方法中使用如下代码:

Intent intent = new Intent(cotenxt, NextActivity.class);
context.startActivity(intent);

其次, 参考this answer上传图片到php服务。

【讨论】:

我已经编辑了我的帖子。我正在尝试输入没有图像的信息。数据库中的一个字段是自动增量,所以我没有为此输入数据。只是从用户那里获得的其他人。 我正在真实设备上进行测试,并尝试连接到 WAMP 上的 MySQL。根据其他帖子,我已将 ip 用于我的手机,但它只是跳转到下一个活动而无需插入数据库。有什么建议么? @Abdulhamid Dhaiban

以上是关于多个操作的后台任务 - Android的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何管理永久后台任务?

Android 后台任务执行

Linux中从后台启动进程,应在命令结尾处加上啥符号

Android编程,后台任务中的后台任务(Context)不能应用于()

从后台任务中更新android UI

Android 多线程 AsyncTask 完成后台任务并反馈给UI