类型不匹配:无法从AsyncTask <string,integer,string>转换为String </string,integer,string>

时间:2013-12-03 01:32:52

标签: android string android-asynctask

我正在尝试使用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;
    }

非常感谢任何帮助。

5 个答案:

答案 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
 }