带输入和输出的Android AsyncTask无法正常工作

时间:2014-09-04 09:51:36

标签: java android android-asynctask

我有2个类:一个处理UI的主类和另一个使用PHP从SQL Server检索数据的类。

从第一个类开始,第二个类中的mehtod通过传递和检索变量来调用。 实际上没有AsyncTask它正常工作。

但是由于我想在运行Android 3.0及更高版本的设备上使用该代码,我需要将该方法更改为AsyncTask。否则我收到此错误:" android.os.networkonmainthreadexception"

实际工作代码如下所示:

主要课程:

...
String inputString="1";
String outputString;
outputString = Class2.SomeMethodInClass2(inputString);   
....

等级2:

public class Class2 {

   public static String SomeMethodInClass2(String input) {
      String Output;
      ...
      //Do some php-sql stuff based on "input"-variable
      //and return the "output"-variable 
      ...
      return output;
   }
}

此代码在Android 2.0上完美运行,但我需要将其更改为AsyncTask,因为Andoid 3.0及以上版本给了我:" android.os.networkonmainthreadexception"

我已经阅读了很多关于AsyncTask的帖子,但我无法在代码中使用输入和输出。 Eclipse总是告诉我我的代码有问题。

如何更改代码,成为异步任务? (请使用我上面的代码示例解释)

- 编辑:如果有更简单的方法摆脱" android.os.networkonmainthreadexception"在3.0以上比AsyncTask,这也没关系! -

2 个答案:

答案 0 :(得分:0)

SecondClass

中进行回调

使用SecondClass

扩展您的Asynctask

实施preExecutedoinbackgroundpostExecute方法

doinbackground中填写您的资料 在doinbackground

中返回结果

postExecute传递结果Callback

SecondClass.Callback中实施FirstClassSecondClass

开始Callback(执行)并传递FirstClass引用

在Callback中,只需使用结果

处理您的下一个操作

编辑:

public class SecondClass extends AsyncTask<String, Void, String> {
public interface Callback {
    public void update(String result);
}
Callback mCallback;

    public SecondClass(Callback callback) {
        super();
    mCallback = callback;
    }

    @Override
    protected String doInBackground(String... params) {
    String result = null;
        //do your stuff and save result
        return result;
    }

@Override
    protected void onPostExecute(String result) {
    if(mCallback != null)
    mCallback.update(result)
        super.onPostExecute(e);
    }
}

public class FirstClass implements SecondClass.Callback{
@Override
public void update(String result){
      //do your stuff with result
}

return_type someMethod(){
  SecondClass sc = new SecondClass(this) ;
  sc.execute(someurl);
  }
  }

答案 1 :(得分:0)

感谢您的帖子!

但我找到了一种替代方法,对我来说比做异步任务更容易和更好。 我加入了我的主要班级:

public class MainClass extends Activity implements OnTouchListener {
    ...
    BackgroundOperations1 ourBackgroundOperations; //<===new
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ourBackgroundOperations = new BackgroundOperations1();  //<===new
        ...
    }

    @Override
    protected void onPause() {
        ....
        ourBackgroundOperations.pause();  // <===new
    }

    @Override
    protected void onResume() {
        ....
        ourBackgroundOperations.resume();  // <===new
    }




    //whole new class inside of "MainClass"
    //runs a different thread, i believe...?
    public class BackgroundOperations1 implements Runnable {
            Thread ourThread = null;
            boolean isRunning = false;



            public void pause() {
                    isRunning = false;
                    while (true) {
                        try {
                            ourThread.join();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        break;
                    }
            }

            public void resume() {
                    isRunning = true;
                    ourThread = new Thread(this);
                    ourThread.start();
            }

            @Override
            public void run() {
                while (isRunning) {
                    if (dothis==true){
                        //here i call my mehtod from class2, whenever "dothis" is set to true (somewhere in my onTouch or where ever i want)
                        String inputString="1";
                        String outputString;
                        outputString = Class2.SomeMethodInClass2(inputString);

                    }   
                }
            }
    }
}       

这适用于Android 4.0,我认为这是我想要的最佳方式。对我而言,AsyncTask似乎更清晰,因为我可以用简单的方式调用我的方法来传递变量。

或者有没有理由不这样做?