我正在尝试将项目发布到数据库中,但我遇到了AsynTask的致命异常。一直试图找到一个解决方案很长一段时间,但仍然无法解决它。我已经在清单中添加了互联网权限。
这是logcat:
02-23 10:38:24.216: E/AndroidRuntime(2202): FATAL EXCEPTION: AsyncTask #1
02-23 10:38:24.216: E/AndroidRuntime(2202): java.lang.RuntimeException: An error occured while executing doInBackground()
02-23 10:38:24.216: E/AndroidRuntime(2202): at android.os.AsyncTask$3.done(AsyncTask.java:299)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.util.concurrent.FutureTask.run(FutureTask.java:239)
02-23 10:38:24.216: E/AndroidRuntime(2202): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.lang.Thread.run(Thread.java:841)
02-23 10:38:24.216: E/AndroidRuntime(2202): Caused by: java.lang.NullPointerException
02-23 10:38:24.216: E/AndroidRuntime(2202): at my.fyp.inticlassifieds.PostItemForm$CreateNewProduct.doInBackground(PostItemForm.java:103)
02-23 10:38:24.216: E/AndroidRuntime(2202): at my.fyp.inticlassifieds.PostItemForm$CreateNewProduct.doInBackground(PostItemForm.java:1)
02-23 10:38:24.216: E/AndroidRuntime(2202): at android.os.AsyncTask$2.call(AsyncTask.java:287)
02-23 10:38:24.216: E/AndroidRuntime(2202): at java.util.concurrent.FutureTask.run(FutureTask.java:234)
02-23 10:38:24.216: E/AndroidRuntime(2202): ... 4 more
02-23 10:38:24.866: I/Choreographer(2202): Skipped 61 frames! The application may be doing too much work on its main thread.
02-23 10:38:25.616: I/Choreographer(2202): Skipped 54 frames! The application may be doing too much work on its main thread.
02-23 10:38:27.246: E/WindowManager(2202): Activity my.fyp.inticlassifieds.PostItemForm has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b12d87c8 V.E..... R.....ID 0,0-729,192} that was originally added here
02-23 10:38:27.246: E/WindowManager(2202): android.view.WindowLeaked: Activity my.fyp.inticlassifieds.PostItemForm has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b12d87c8 V.E..... R.....ID 0,0-729,192} that was originally added here
02-23 10:38:27.246: E/WindowManager(2202): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:345)
02-23 10:38:27.246: E/WindowManager(2202): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:239)
02-23 10:38:27.246: E/WindowManager(2202): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
02-23 10:38:27.246: E/WindowManager(2202): at android.app.Dialog.show(Dialog.java:281)
02-23 10:38:27.246: E/WindowManager(2202): at my.fyp.inticlassifieds.PostItemForm$CreateNewProduct.onPreExecute(PostItemForm.java:92)
02-23 10:38:27.246: E/WindowManager(2202): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
02-23 10:38:27.246: E/WindowManager(2202): at android.os.AsyncTask.execute(AsyncTask.java:534)
02-23 10:38:27.246: E/WindowManager(2202): at my.fyp.inticlassifieds.PostItemForm$1.onClick(PostItemForm.java:72)
02-23 10:38:27.246: E/WindowManager(2202): at android.view.View.performClick(View.java:4240)
02-23 10:38:27.246: E/WindowManager(2202): at android.view.View$PerformClick.run(View.java:17721)
02-23 10:38:27.246: E/WindowManager(2202): at android.os.Handler.handleCallback(Handler.java:730)
02-23 10:38:27.246: E/WindowManager(2202): at android.os.Handler.dispatchMessage(Handler.java:92)
02-23 10:38:27.246: E/WindowManager(2202): at android.os.Looper.loop(Looper.java:137)
02-23 10:38:27.246: E/WindowManager(2202): at android.app.ActivityThread.main(ActivityThread.java:5103)
02-23 10:38:27.246: E/WindowManager(2202): at java.lang.reflect.Method.invokeNative(Native Method)
02-23 10:38:27.246: E/WindowManager(2202): at java.lang.reflect.Method.invoke(Method.java:525)
02-23 10:38:27.246: E/WindowManager(2202): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-23 10:38:27.246: E/WindowManager(2202): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-23 10:38:27.246: E/WindowManager(2202): at dalvik.system.NativeStart.main(Native Method)
以下是代码:
public class PostItemForm extends Activity {
// Progress Dialog
private ProgressDialog pDialog;
JSONParser jsonParser = new JSONParser();
EditText itemName;
EditText itemPrice;
EditText itemDesc;
Spinner itemCat;
// url to create new product
private static String url_create_product = "http://inticlassifields.comze.com/public_html/phpscripts/post_item.php";
// JSON Node names
private static final String TAG_SUCCESS = "success";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post_item_form);
// Edit Text
itemName = (EditText) findViewById(R.id.i_itemname);
itemPrice = (EditText) findViewById(R.id.i_price);
itemDesc = (EditText) findViewById(R.id.i_des);
itemCat = (Spinner) findViewById(R.id.spinner1);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.item_cat, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
itemCat.setAdapter(adapter);
// Create button
Button btnCreateProduct = (Button) findViewById(R.id.submitpostitem);
// button click event
btnCreateProduct.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// creating new product in background thread
new CreateNewProduct().execute();
}
});
}
/**
* Background Async Task to Create new product
* */
class CreateNewProduct extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(PostItemForm.this);
pDialog.setMessage("Posting item..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Creating product
* */
protected String doInBackground(String... args) {
String date_posted = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String name = itemName.getText().toString();
String price = itemPrice.getText().toString();
String description = itemDesc.getText().toString();
String category = itemCat.getSelectedItem().toString();
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("name", name));
params.add(new BasicNameValuePair("price", price));
params.add(new BasicNameValuePair("date", date_posted));
params.add(new BasicNameValuePair("description", description));
params.add(new BasicNameValuePair("category", category));
// getting JSON Object
// Note that create product url accepts POST method
JSONObject json = jsonParser.makeHttpRequest(url_create_product,
"POST", params);
// check log cat from response
Log.d("Create Response", json.toString());
// check for success tag
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully created product
Toast.makeText(PostItemForm.this,"Item posted", Toast.LENGTH_LONG).show();
// closing this screen
finish();
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
}
}
}
我修复了nullpointerexception但现在我正面临着我的json的另一个问题。这是什么类型的错误?
02-24 03:07:36.478: E/JSON(2309): <br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><font face='Arial' size='1' color='#000000'><b>PHP Error Message</b></font></td></tr></table><br />
02-24 03:07:36.478: E/JSON(2309): <b>Warning</b>: require_once(include/DB_Functions.php) [<a href='function.require-once'>function.require-once</a>]: failed to open stream: No such file or directory in <b>/home/a3335925/public_html/phpscripts/index.php</b> on line <b>17</b><br />
02-24 03:07:36.478: E/JSON(2309): <br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><div align='center'><a href='http://www.000webhost.com/'><font face='Arial' size='1' color='#000000'>Free Web Hosting</font></a></div></td></tr></table><br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><font face='Arial' size='1' color='#000000'><b>PHP Error Message</b></font></td></tr></table><br />
02-24 03:07:36.478: E/JSON(2309): <b>Fatal error</b>: require_once() [<a href='function.require'>function.require</a>]: Failed opening required 'include/DB_Functions.php' (include_path='.:/usr/lib/php:/usr/local/lib/php') in <b>/home/a3335925/public_html/phpscripts/index.php</b> on line <b>17</b><br />
02-24 03:07:36.478: E/JSON(2309): <br><table border='1' cellpadding='2' bgcolor='#FFFFDF' bordercolor='#E8B900' align='center'><tr><td><div align='center'><a href='http://www.000webhost.com/'><font face='Arial' size='1' color='#000000'>Free Web Hosting</font></a></div></td></tr></table>
02-24 03:07:36.478: E/JSON Parser(2309): Error parsing data org.json.JSONException: Value <br><table of type java.lang.String cannot be converted to JSONObject
答案 0 :(得分:3)
你已经两次声明了你的Spinner,这就是Null Pointer Error抛出的原因。
如果你看到,在班级你有,
Spinner itemCat;
然后在你的onCreate中再次拥有,
Spinner itemCat = //your layout Spinner.
因此,您已初始化了本地Spinner变量itemCat,而在asynctask中,您正在调用仍为null的类级itemCat。
在onCreate中只需更改,
Spinner itemCat = //your layout Spinner.
到
itemCat = //your layout Spinner.
答案 1 :(得分:1)
您只能从UI线程进行UI更改。您正在doInBackground
内创建一个在另一个线程中运行的Toast。您需要使用onPostExecute
方法或onProgressUpdated
方法创建吐司。
因此,在您的情况下,您应该使doInBackground
方法返回将在onPostExceute()中捕获的成功值。在那里你可以检查成功的值是1是否一切正常,如果没有,则检查0,然后在onPostExecute
方法上查看返回的值,然后采取行动。