我有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,这也没关系! -
答案 0 :(得分:0)
在SecondClass
使用SecondClass
Asynctask
实施preExecute
,doinbackground
,postExecute
方法
在doinbackground
中填写您的资料
在doinbackground
在postExecute
传递结果到Callback
在SecondClass.Callback
中实施FirstClass
从SecondClass
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似乎更清晰,因为我可以用简单的方式调用我的方法来传递变量。
或者有没有理由不这样做?