Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用doInBackground的结果设置文本视图_Java_Android_Android Asynctask - Fatal编程技术网

Java 使用doInBackground的结果设置文本视图

Java 使用doInBackground的结果设置文本视图,java,android,android-asynctask,Java,Android,Android Asynctask,我是Android新手,我试图使用php脚本和本地主机通信,并访问一个简单的数据库。 我在doInBackground()方法中定义了一个任务,它从本地主机上存储的数据库中获取一个值(我不知道该部分是否有效)。 我想使用doInBackground方法返回的结果在活动的textview中设置文本 public class BackgroundWorker extends AsyncTask<String,Void,String> { Context context;

我是Android新手,我试图使用php脚本和本地主机通信,并访问一个简单的数据库。 我在doInBackground()方法中定义了一个任务,它从本地主机上存储的数据库中获取一个值(我不知道该部分是否有效)。 我想使用doInBackground方法返回的结果在活动的textview中设置文本

public class BackgroundWorker extends AsyncTask<String,Void,String> {

    Context context;


    BackgroundWorker(Context ctx)
    {
        context = ctx;
    }

    @Override
    protected String doInBackground(String... params) {
        String group = params[0];
        String child = params[1];
        String address = "http://10.0.2.2/conn.php";

        URL url = null;
        try {
            url = new URL(address);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            OutputStream outputStream = httpURLConnection.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
            String post_data = URLEncoder.encode("group", "UTF-8") + "=" + URLEncoder.encode(group, "UTF-8") + "&"
                    + URLEncoder.encode("child", "UTF-8") + "=" + URLEncoder.encode(child, "UTF-8");
            bufferedWriter.write(post_data);
            bufferedWriter.flush();
            bufferedWriter.close();
            outputStream.close();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "iso-8859-1"));
            String result = "";
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                result += line;
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();
            return result;
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


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

    @Override
    protected void onPostExecute(String s) {

        super.onPostExecute(s);
    }

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

我想设置txtName2。

您可以使用接口将数据返回到活动中

接口

    public interface AsyncResponse {
    public void onFinish(Object output);
}
SomeAsyncTask类

public class SomeAsyncTask extends AsyncTask<String, String, String> {
private AsyncResponse asyncResponse;

public SomeAsyncTask(AsyncResponse asyncResponse) {
    this.asyncResponse = asyncResponse;

}

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

   //Do something 
    .....
   //Finally return something

   return "returnSomeString";
}

@Override
protected void onPostExecute(String s) {
    super.onPostExecute(s);
    asyncResponse.onFinish(s);
}}
    SomeAsyncTask someAsyncTask=new SomeAsyncTask(new AsyncResponse() {
        @Override
        public void onFinish(Object output) {
            String result= (String) output;
            //Finally set your views
        }
    });
    someAsyncTask.execute();
}

这是主线程中的字符串

protected void onPostExecute(String s) {
    // s is your string 
    super.onPostExecute(s);
}
在BackgroundWorker类中添加以下代码

  private String textFortxtName2;

public String getTextFortxtName2() {
    return textFortxtName2;
}

public void setTextFortxtName2(String textFortxtName2) {
    this.textFortxtName2 = textFortxtName2;
}
然后加上这个

protected void onPostExecute(String s) {
// s is your string 
textFortxtName2 = s;
super.onPostExecute(s);
}

现在您可以从您的主要活动中获取文本

...
BackgroundWorker backgroundWorker = new BackgroundWorker(this);
backgroundWorker.execute(group,child);
txtName2.setText(backgroundWorker.getTextFortxtName2());
就这些:)
如果有任何问题或疑问,请定义一个接口以获取backgroundworker的结果,并使workers构造函数获取该接口的第二个参数。在执行后调用该接口对象并将结果作为参数。而不是像这样使用它:

BackgroundWorker backgroundWorker = new BackgroundWorker(this, new bgWorkerListener() {
            @Override
            public void onResult(String s) {
                txtname2.settext(s);
            }
        });
        backgroundWorker.execute(group, child);

调用
doInBackground
后,返回结果,然后将这些结果传递到
onPostExecute
,在那里可以设置
txtName2.setText(结果)
BackgroundWorker和viewTT是两个不同的文件吗?您可以使用eventBus库解决问题。如果任务未完成(通常不会完成),该怎么办?
BackgroundWorker(上下文ctx){Context=ctx;}
后台工作者类的构造函数仍然只初始化上下文可以吗?我不明白你的问题,会发生什么?你有一个包,,,你必须在方法结束之前添加返回结果我是说你的getTextFortxtName2()函数大部分时间将返回null。您创建了一个对asynctask内部活动的硬引用,这很容易导致内存泄漏。如果他想要内存泄漏,最好使用
静态
,而不是使用太多代码。如果不建议我做错事,现在可以吗。
BackgroundWorker backgroundWorker = new BackgroundWorker(this, new bgWorkerListener() {
            @Override
            public void onResult(String s) {
                txtname2.settext(s);
            }
        });
        backgroundWorker.execute(group, child);