我正在尝试在AsyncTask中获取共享首选项,但我没有得到它。
我如何在这里使用上下文?
package com.example.wettkampftimerbt;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.URL;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.AsyncTask;
public class network extends AsyncTask<URL, String, String> {
private final String PREFS_NAME = "prefs", W1 = "w1", W2="w2", W3="w3", W4="w4",
W5="w5", W6="w6", W7="w7", SENDBEG="sendbeg", SENDEND="sendend";
int w1, w2, w3, w4, w5, w6, w7, sendend, sendbeg;
protected String doInBackground(URL... params) {
int c2, c3, c4, c5, c6;
int w0 = 00;
try {
w1 = sendbeg;
c2 = w2;
c3 = w3;
c4 = w4;
c5 = w5;
c6 = w6;
w7 = sendend;
Socket ss = new Socket("192.168.3.100", 4455);
System.out.println(ss);
boolean stopData = true;
System.out.println("lane1 stop send");
DataOutputStream dos = new DataOutputStream(
ss.getOutputStream());
while (stopData) {
dos.writeByte(w0);
dos.writeByte(w1);
dos.writeByte(c2);
dos.writeByte(c3);
dos.writeByte(c4);
dos.writeByte(c5);
dos.writeByte(c6);
dos.writeByte(w7);
stopData=false;
}
} catch (IOException e) {
System.out.println("IO error" + e);
e.printStackTrace();
}
return "Done";
}
public void onPreExecute(){
Context context = network.this;
SharedPreferences prefs = context.getSharedPreferences("PREFS_NAME");
doInBackground();
}
public void getPrefs (Context context){
w1= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W1, "00"));
w2= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W2, "00"));
w3= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W3, "00"));
w4= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W4, "00"));
w5= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W5, "00"));
w6= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W6, "00"));
w7= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(W7, "00"));
sendbeg= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(SENDBEG, "00"));
sendend= Integer.valueOf(context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(SENDEND, "00"));
}
}
这是片段,我的问题是:我没有错误,除了 nullPointerException (由getPrefs(null);
引起?)在Start上。有人能帮助我吗?
我已经阅读了很多上下文解释,甚至我访问过的Android开发者网站,但我没有得到,有什么背景,以及它到底是做什么。
编辑:感谢快速的答案,但它仍然无效。我现在将整个活动放在这里,你给我一个样本,但我现在得到错误。这取决于我,还是Eclipse恨我?EDIT2:我自己调用doInBackground,因为它不能自己启动。
EDIT3:现在工作,它工作^^我直接从我的主要活动调用getPrefs,然后从getPrefs网络...到目前为止很好,但是:我收到此NetworkOnMainThreadException错误。现在该怎么办?
答案 0 :(得分:1)
试试这个:
1)在Async类中定义一个局部变量(在你的情况下是网络类)
Context context;
2)在Async Task中创建构造函数以接受上下文:
public network(Context context) {
this.context = context;
}
3)现在,在onPreExecute()
调用getPrefs
时,请按以下方式调用:
getPrefs(context);
4)您可以从MainActivity中调用此类,如下所示:
network networkObj= new network(MainActivity.this);
networkObj.execute(url);
答案 1 :(得分:1)
您必须将班级的上下文提供给getPrefs()
。
使用getPrefs(yourActivity.this)
。
答案 2 :(得分:0)
有两种选择:
<强> 1。将AsyncTask定义为Activity的内部类
您的AsyncTask类必须为静态才能生效。
public class MyActivity extends Activity {
...
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
...
public void onPreExecute() {
Context context = MyActivity.this;
SharedPreferences prefs = context.getSharedPreferences("PREFS_NAME");
}
}
}
<强> 2。将您的Activity / context传递给AsyncTask构造函数并维护WeakReference
您的AsyncTask类应该是静态的。不要仅仅维护对您的Activity / context的硬引用(除非它是Application上下文),否则你将泄漏内存:
public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private WeakReference<Context> mContextRef;
public MyAsyncTask(Context context) {
mContextRef = new WeakReference<Context>(context);
}
...
public void onPreExecute() {
Context context = mContextRef.get();
// context may be null if the activity has been destroyed
if (context != null) {
SharedPreferences prefs = context.getSharedPreferences("PREFS_NAME");
}
}
}