我正在尝试使用AsyncTask将字符串从一个类发送到另一个类。在下面的代码中,一切都没有错误,但我想从newThread.execute()获取返回的str并将其保存到字符串测试中。我试过test = newThread.execute(),但是我产生以下错误:类型不匹配:无法从AsyncTask转换为String。
Class1.java
public void changText(View view) {
String test = "";
NewThread newThread = new NewThread();
newThread.execute();
}
Class2.java
public class NewThread extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
String str = "this is a test";
return str;
}
非常感谢任何帮助。
答案 0 :(得分:1)
AsyncTask不能像那样工作,AsyncTask必须被子类化才能使用。
AsyncTask的建议是在一个单独的线程(不同于UI线程)中执行一些代码,但是该代码的结果在准备好后将在onPostExecute
中传递。
所以,你的代码看起来像这样:
public Class1{
String test = "";
public void changText(View view) {
NewThread newThread = new NewThread();
newThread.execute("input");
}
public class NewThread extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String str = params[0] + " this is a test";
return str;
}
@Override
protected void onPostExecute(String result) {
test = result;
}
}
}
答案 1 :(得分:1)
如果您将AsyncTask
放入其自己的文件中,则需要一种通过某种回调机制发布结果的方法。根据依赖倒置原则,最好让AsyncTask定义回调机制,而不是直接依赖于某些活动。
结果任务可能如下所示:
public class NewThread extends AsyncTask<String, Integer, String> {
/** A callback interface to be implemented by clients of this class */
public interface NewThreadClient {
void onNewThreadResult(String result);
}
private final NewThreadClient mClient;
public NewThread(NewThreadClient client) {
mClient = client;
}
@Override
protected String doInBackground(String... params) {
String str = "this is a test";
return str;
}
@Override
protected void onPostExecute(String result) {
mClient.onNewThreadResult(result);
}
}
要使用它,您需要一些实现回调的东西。例如Activity
public class TestActivity extends Activity implements NewThread.NewThreadClient {
private TextView mText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// simple textview actually intended for listviews..
setContentView(android.R.layout.simple_list_item_1);
mText = (TextView) findViewById(android.R.id.text1);
new NewThread(this).execute();
}
@Override
public void onNewThreadResult(String result) {
mText.setText(result);
}
}
AsyncTask的意思是它以异步方式完成任务(当你的程序执行其他操作时,结果将在未来的某个时间点计算)。你不能(有方法,但绝对没有意义)立即得到结果。 test = newThread.execute()
要求结果立即可用。如果您开始等待结果,则会阻止在此期间可能发生的任何进展。
回调是在以后获取结果的最常用方法。 AsyncTask
为此目的内置了onPostExecute
(也是为了在UI线程中提供结果),如果您将AsyncTasks
作为内部类,则可以直接使用它。添加另一层回调,您可以轻松地在各个类中使用它们。
答案 2 :(得分:0)
试试这个:
String test = newThread.execute().get();
newThread.execute()返回的值不是计算结果;它是AsyncTask本身。要发布结果,请在NewThread中编写一个方法:
void onPostExecute(ArrayList<HashMap<String,String>> result) {
returnString = result; // or something similar
// then update the UI to reflect the results
}
答案 3 :(得分:0)
看看你是否打算做我在以下代码中所做的事情
package com.example.myfirstapp;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
public class MyActivity extends Activity {
private String test;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
NewThread newThread = new NewThread();
newThread.execute();
}
class NewThread extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
String str = "this is a test";
return str;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
test=result;
// update the UI like view.setText(test);
}
}
}
答案 4 :(得分:0)
与文档AsyncTask. execute (Params... params)
一样Return instance of AsyncTask.
但您正在尝试将AsyncTask实例分配给String。要从Asynctask作为String返回结果,您应该在主线程上调用execute().get()
方法:
NewThread newThread = new NewThread();
String test= newThread.execute().get(); //<< get String from doInBackground
但这将停止执行主线程,直到doInBackground方法执行未完成。
如果你想在不停止执行主线程的情况下从doInBackground
获得结果,那么使用onPostExecute
来更新UI,因为当doInBackground执行完成时,此方法在主UI线程上调用:
@Override
protected void onPostExecute(String result) {
test = result; //<< get result here
}